随着数据量的增大,HIVE查询HBase的时候又出现了scan数据缓慢的问题,上次是因为跨网段读数据没有设置client端cache,这次是在HBase regionserver的log中出现了如下错误:
[plain] view plain copy print ?
- org.apache.hadoop.hbase.regionserver.LeaseException: lease '-8841369309248784313' 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 java.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)
- 2012-05-28 13:36:21,181 ERROR org.apache.hadoop.hbase.regionserver.HRegionServer:
- org.apache.hadoop.hbase.regionserver.LeaseException: lease '-20083236624351071' 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 java.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)
- 2012-05-28 13:36:31,008 INFO org.apache.hadoop.hbase.regionserver.HRegionServer: Scanner -3191709564730585697 lease expired
- 2012-05-28 13:36:53,643 INFO org.apache.hadoop.hbase.regionserver.HRegionServer: Scanner -8491627947231463698 lease expired
- 2012-05-28 13:36:54,842 ERROR org.apache.hadoop.hbase.regionserver.HRegionServer:
- org.apache.hadoop.hbase.regionserver.LeaseException: lease '-1061333795005896429' 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 java.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)
- 2012-05-28 13:36:54,952 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server Responder, call next(-8841369309248784313, 5000) from 10.64.49.25:58991: output error
- 2012-05-28 13:36:54,952 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server handler 5 on 60020 caught: java.nio.channels.ClosedChannelException
- at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:133)
- at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324)
- at org.apache.hadoop.hbase.ipc.HBaseServer.channelIO(HBaseServer.java:1389)
- at org.apache.hadoop.hbase.ipc.HBaseServer.channelWrite(HBaseServer.java:1341)
- at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.processResponse(HBaseServer.java:727)
- at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.doRespond(HBaseServer.java:792)
- at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1083)
-
- 2012-05-28 13:36:58,234 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server Responder, call next(-1061333795005896429, 5000) from 10.64.49.22:5606: output error
- 2012-05-28 13:36:58,234 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server handler 6 on 60020 caught: java.nio.channels.ClosedChannelException
- at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:133)
- at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324)
- at org.apache.hadoop.hbase.ipc.HBaseServer.channelIO(HBaseServer.java:1389)
- at org.apache.hadoop.hbase.ipc.HBaseServer.channelWrite(HBaseServer.java:1341)
- at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.processResponse(HBaseServer.java:727)
- at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.doRespond(HBaseServer.java:792)
- at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1083)
-
- 2012-05-28 13:37:12,103 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server Responder, call next(-20083236624351071, 5000) from 10.64.49.25:59004: output error
- 2012-05-28 13:37:12,103 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server handler 1 on 60020 caught: java.nio.channels.ClosedChannelException
- at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:133)
- at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324)
- at org.apache.hadoop.hbase.ipc.HBaseServer.channelIO(HBaseServer.java:1389)
- at org.apache.hadoop.hbase.ipc.HBaseServer.channelWrite(HBaseServer.java:1341)
- at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.processResponse(HBaseServer.java:727)
- at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.doRespond(HBaseServer.java:792)
- at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1083)
org.apache.hadoop.hbase.regionserver.LeaseException: lease '-8841369309248784313' 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 java.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)
2012-05-28 13:36:21,181 ERROR org.apache.hadoop.hbase.regionserver.HRegionServer:
org.apache.hadoop.hbase.regionserver.LeaseException: lease '-20083236624351071' 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 java.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)
2012-05-28 13:36:31,008 INFO org.apache.hadoop.hbase.regionserver.HRegionServer: Scanner -3191709564730585697 lease expired
2012-05-28 13:36:53,643 INFO org.apache.hadoop.hbase.regionserver.HRegionServer: Scanner -8491627947231463698 lease expired
2012-05-28 13:36:54,842 ERROR org.apache.hadoop.hbase.regionserver.HRegionServer:
org.apache.hadoop.hbase.regionserver.LeaseException: lease '-1061333795005896429' 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 java.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)
2012-05-28 13:36:54,952 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server Responder, call next(-8841369309248784313, 5000) from 10.64.49.25:58991: output error
2012-05-28 13:36:54,952 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server handler 5 on 60020 caught: java.nio.channels.ClosedChannelException
at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:133)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324)
at org.apache.hadoop.hbase.ipc.HBaseServer.channelIO(HBaseServer.java:1389)
at org.apache.hadoop.hbase.ipc.HBaseServer.channelWrite(HBaseServer.java:1341)
at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.processResponse(HBaseServer.java:727)
at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.doRespond(HBaseServer.java:792)
at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1083)
2012-05-28 13:36:58,234 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server Responder, call next(-1061333795005896429, 5000) from 10.64.49.22:5606: output error
2012-05-28 13:36:58,234 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server handler 6 on 60020 caught: java.nio.channels.ClosedChannelException
at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:133)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324)
at org.apache.hadoop.hbase.ipc.HBaseServer.channelIO(HBaseServer.java:1389)
at org.apache.hadoop.hbase.ipc.HBaseServer.channelWrite(HBaseServer.java:1341)
at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.processResponse(HBaseServer.java:727)
at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.doRespond(HBaseServer.java:792)
at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1083)
2012-05-28 13:37:12,103 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server Responder, call next(-20083236624351071, 5000) from 10.64.49.25:59004: output error
2012-05-28 13:37:12,103 WARN org.apache.hadoop.ipc.HBaseServer: IPC Server handler 1 on 60020 caught: java.nio.channels.ClosedChannelException
at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:133)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324)
at org.apache.hadoop.hbase.ipc.HBaseServer.channelIO(HBaseServer.java:1389)
at org.apache.hadoop.hbase.ipc.HBaseServer.channelWrite(HBaseServer.java:1341)
at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.processResponse(HBaseServer.java:727)
at org.apache.hadoop.hbase.ipc.HBaseServer$Responder.doRespond(HBaseServer.java:792)
at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1083)
说是租约(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的时候还是出现了上面的问题。问题出在哪呢?
后来发现是hbase.rpc.timeout的问题,出现租约过期的时候,可以根据需求适当的增加租约的有效时间,但却忽略了RPC超时的问题,所以在增大hbase.regionserver.lease.period的时候应该同时增大hbase.rpc.timeout,同时hbase.rpc.timeout应该等于或大于hbase.regionserver.lease.period。
参考HBASE-4713,lease-does-not-exist-exceptions