最近在python项目中通过thrift API操作HBase,发现thrift server在执行操作后运行一段时间就会crash,一番折腾发现这是HBase-thrift的天炸BUG
抛出异常
[thrift-worker-11] thrift.ThriftServerRunner$HBaseHandler: Can't get the location at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.getRegionLocations(RpcRetryingCallerWithReadReplicas.java:309) at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:153) at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:61) at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200) ...
异常原因描述
当空闲的连接从thrift server被清除的时候,该连接之下的table实例依然缓存在线程的local cache中,当再次操作table的时候自然会出现 Can’t get the location 的异常,因为连接早已关闭.
异常影响
受影响版本:
0.98.13, 1.1.1, 1.0.1.1, 1.1.0.1
已修复版本:
2.0.0, 0.98.14, 1.0.2, 1.2.0, 1.1.2, 1.3.0
Thrift影响:
该Bug出现在Thrift1中,Thrift2没有这个问题
解决方法
替换已修复版本的jar依赖,注意版本兼容问题(例如:v1.1.1的修复参考请替换为v1.1.2)