impala调用Hbase表数据操作时,提示 LeaseException 异常,主要原因是hbase数据过大,调用期间没有汇报心跳导致
WARNINGS: LeaseException: org.apache.hadoop.hbase.regionserver.LeaseException: lease '-8355984789923245890' does not existat org.apache.hadoop.hbase.regionserver.Leases.removeLease(Leases.java:224)at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3288)at org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:42002)at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:409)at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:130)at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:324)at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:304)CAUSED BY: RemoteWithExtrasException: org.apache.hadoop.hbase.regionserver.LeaseException: lease '-8355984789923245890' does not existat org.apache.hadoop.hbase.regionserver.Leases.removeLease(Leases.java:224)at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3288)at org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:42002)at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:409)at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:130)at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:324)at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:304)
是租约(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。