HBase 实战中遇到的坑

来源:互联网 发布:淘宝 中老年男装毛衣 编辑:程序博客网 时间:2024/06/08 13:44
问题一 :
HTable.backgroundFlushCommits;
HTable.flushCommits;
HTable.close;

解决方案 ,对同一个表进行的操作 htable = new HTable(config, "CRM_MEMBER_ALL");中的config 要每次都new一个新的出来,不能用同一个,不然会报错!主要是需要用不同的htable对象来操作,但是如果是同一个连接,同一个个表名table = new HTable(config, "CRM_MEMBER_ALL");创建出来的貌似是同一个对象。当然有的时候显然这样操作是不合适的,所以推荐采用HTableInterface 对象来操作。

举栗:
Configuration config = HBaseConfiguration.create();
HConnection conn = HConnectionManager.createConnection(config);
HTableInterface table_all = conn.getTable(tableName_all);
HTableInterface table_var = conn.getTable(tableName_var);
blabla.....操作hbase......blabla.....
  }
if(table_var!=null){
table_var.close();
}
if(table_all!=null){
table_all.close();
}
conn.close();

问题二 :
在取值相同时间戳的row是 完全没问题,当按照某列获取到整行数据时,其取值是只包含与列相同时间戳的其他列元素,不通的时间戳的列 ,即使存在也取不到。ps:该坑未细致探究过,只是遇到这种情况。如果有验证过的小伙伴欢迎指正。
举栗子:
SingleColumnValueFilter filter = new SingleColumnValueFilter(
          Bytes.toBytes("INFO"),
          Bytes.toBytes("列名"),
          CompareOp.GREATER_OR_EQUAL,
          Bytes.toBytes( 条件 )
 );

问题三:
在牵涉到hbase的Kerberos认证的时候,遇到如下问题,需将认证重新初始化。kinit.exe –kt 路径名\xxx.keytab xxx@xxx
[2017-01-04 10:23:50,311] ERROR QuartzScheduler_Worker-1 xxxxxx - error
java.lang.IllegalArgumentException: Can't get Kerberos realm
at org.apache.hadoop.security.HadoopKerberosName.setConfiguration(HadoopKerberosName.java:65)
at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:227)
at org.apache.hadoop.security.UserGroupInformation.setConfiguration(UserGroupInformation.java:249)
at com.bse.util.OnlineHBaseUtil.<init>(OnlineHBaseUtil.java:45)
at com.bse.scheduler.CompareToHbaseTable.memberVar(CompareToHbaseTable.java:107)
at com.bse.scheduler.CompareToHbaseTable.execute(CompareToHbaseTable.java:76)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor52.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.hadoop.security.authentication.util.KerberosUtil.getDefaultRealm(KerberosUtil.java:75)
at org.apache.hadoop.security.HadoopKerberosName.setConfiguration(HadoopKerberosName.java:63)
... 7 more
Caused by: KrbException: Cannot locate default realm
at sun.security.krb5.Config.getDefaultRealm(Config.java:1151)
... 12 more
Caused by: KrbException: Generic error (description in e-text) (60) - Unable to locate Kerberos realm
at sun.security.krb5.Config.getRealmFromDNS(Config.java:1247)
at sun.security.krb5.Config.getDefaultRealm(Config.java:1132)
... 12 more
问题三:
最近的工作中,有个对Hbase的批量scan处理,HBase regionserver的log中出现了如下错误:
org.apache.hadoop.hbase.regionserver.LeaseException: lease '6934' does not exist
at org.apache.hadoop.hbase.regionserver.Leases.removeLease(Leases.java:230)
at org.apache.hadoop.hbase.regionserver.HRegionServer.next(HRegionServer.java:1847)
at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at jva.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:570)
at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1039)
这应该是客户端与regionserver之间交互的“租约”失效的问题。
一般的做法,就是在配置文件中增大hbase.regionserver.lease.period的时间,但也不能忽略rpc连接的超时问题,所以在增大hbase.regionserver.lease.period的时候应该同时增大hbase.rpc.timeout,同时hbase.rpc.timeout应该等于或大于hbase.regionserver.lease.period。

0 0
原创粉丝点击