HBase中的奇怪问题之LeaseException
2013-01-25 14:30
543 查看
在通过.next的方式大量遍历hbase数据时,出现下列异常:org.apache.hadoop.hbase.regionserver.LeaseException
网上有讨论问题原因如:
说是租约(Lease)过期或租约不存在,所谓租约,是指hbase client端每次和regionserver交互的时候,都会在服务器端生成一个租约(Lease),租约的有效期由参数hbase.regionserver.lease.period确定。
客户端去regionserver取数据的时候,hbase中存得数据量很大并且很多region的时候的,客户端请求的region不在内存中,或是没有被cache住,需要从磁盘中加载,如果这时候加载需要的时间超过hbase.regionserver.lease.period所配置的时间,并且客户端没有和regionserver报告其还活着,那么regionserver就会认为本次租约已经过期,并从LeaseQueue中从删除掉本次租约,当regionserver加载完成后,拿已经被删除的租约再去取数据的时候,就会出现如上的错误现象。
其实在做hbase批量数据删除的时候就出现过这个问题,然后也修改了hbase.regionserver.lease.period参数(默认为60000,一分钟),但是在做scan的时候还是出现了上面的问题。问题出在哪呢?
还有一种可能为:
在scan策略中加入了scan.setTimeRange的设置,而在需要遍历的数据中,同时时间戳的filter可能会产生大量的空查询,造成result=rs.next()时长时间的等待。之间在服务端的遍历过程中,如果没有被cache住,需要从磁盘中加载,如果这时候加载需要的时间超过hbase.regionserver.lease.period所配置的时间,并且客户端没有和regionserver报告其还活着,就造成了上述所说的租约过期。
解决方法:在scan处理中,更应该通过startRow和stopRow进行数据的filter,尽量减少通过setTimeRange()进行数据过滤。如:
org.apache.hadoop.hbase.regionserver.LeaseException: org.apache.hadoop.hbase.regionserver.LeaseException: lease '7821189862428512599' does not exist at org.apache.hadoop.hbase.regionserver.Leases.removeLease(Leases.java:231) at org.apache.hadoop.hbase.regionserver.HRegionServer.next(HRegionServer.java:2714) at sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:361) at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1642) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at org.apache.hadoop.hbase.RemoteExceptionHandler.decodeRemoteException(RemoteExceptionHandler.java:96) at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:143) at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:42) at org.apache.hadoop.hbase.client.ServerCallable.withRetries(ServerCallable.java:163) at org.apache.hadoop.hbase.client.ClientScanner.next(ClientScanner.java:278) at com.taobao.member.dao.hbase.common.ResolveHbaseData.getRunData(ResolveHbaseData.java:85)
网上有讨论问题原因如:
说是租约(Lease)过期或租约不存在,所谓租约,是指hbase client端每次和regionserver交互的时候,都会在服务器端生成一个租约(Lease),租约的有效期由参数hbase.regionserver.lease.period确定。
客户端去regionserver取数据的时候,hbase中存得数据量很大并且很多region的时候的,客户端请求的region不在内存中,或是没有被cache住,需要从磁盘中加载,如果这时候加载需要的时间超过hbase.regionserver.lease.period所配置的时间,并且客户端没有和regionserver报告其还活着,那么regionserver就会认为本次租约已经过期,并从LeaseQueue中从删除掉本次租约,当regionserver加载完成后,拿已经被删除的租约再去取数据的时候,就会出现如上的错误现象。
其实在做hbase批量数据删除的时候就出现过这个问题,然后也修改了hbase.regionserver.lease.period参数(默认为60000,一分钟),但是在做scan的时候还是出现了上面的问题。问题出在哪呢?
还有一种可能为:
在scan策略中加入了scan.setTimeRange的设置,而在需要遍历的数据中,同时时间戳的filter可能会产生大量的空查询,造成result=rs.next()时长时间的等待。之间在服务端的遍历过程中,如果没有被cache住,需要从磁盘中加载,如果这时候加载需要的时间超过hbase.regionserver.lease.period所配置的时间,并且客户端没有和regionserver报告其还活着,就造成了上述所说的租约过期。
解决方法:在scan处理中,更应该通过startRow和stopRow进行数据的filter,尽量减少通过setTimeRange()进行数据过滤。如:
Scan scan = new Scan(); scan.addFamily(Bytes.toBytes(HbaseTable.TABLE_BUYER_TRADE_FAMILY)); scan.setStartRow(Bytes.toBytes(startRow)); scan.setStopRow(Bytes.toBytes(stopRow)); //scan.setTimeRange(1358784000000L, 1358870399000L); ResultScanner rs = table.getScanner(scan); if (rs != null) { Result result = null; while((result=rs.next()) != null){ //TODO } }
相关文章推荐
- HBase集群出现NotServingRegionException问题的排查及解决方法
- HBase集群出现NotServingRegionException问题的排查及解决方法
- HBase单机模式配置以及不能创建表问题的解决方法(Caused by: java.net.ConnectException: Connection refused)
- 在大迸发写时,HBase的HDFS DFSClient端报SocketTimeoutException的问题分析和解决
- .NET陷阱之五:奇怪的OutOfMemoryException——大对象堆引起的问题与对策
- spark 从HIVE读数据导入hbase中发生空指针(java.lang.NullPointerException)问题的解决
- HBase集群出现NotServingRegionException问题的排查及解决方法
- Hbase的NoServerForRegionException: Unable to find region for talk,,99999999999999 after 10 tries问题
- 在大并发写时,HBase的HDFS DFSClient端报SocketTimeoutException的问题分析和解决
- 在大并发写时,HBase的HDFS DFSClient端报SocketTimeoutException的问题分析和解决
- HBase集群出现NotServingRegionException问题的排查及解决方法
- HBase集群出现NotServingRegionException问题的排查及解决方法
- HBase集群出现NotServingRegionException问题的排查及解决方法
- hbase无法启动Regionserver:ClassNotFoundException: org.apache.hadoop.util.PlatformName问题解决
- 解决HBase问题hbase.PleaseHoldException
- 奇怪的Excel导入问题,OleDbException (0x80004005): 未指定的错误
- HBase集群出现NotServingRegionException问题的排查及解决方法
- .NET陷阱之五:奇怪的OutOfMemoryException——大对象堆引起的问题与对策
- hbase奇怪问题现场
- hbase数据无法导入问题(org.apache.hadoop.hbase.NotServingRegionException: Region is not online)