一、为什么要设置超时参数
hbase设计的目标是成为一个高可用集群,能够在失败的时候快速响应,当出现网络抖动等偶发情况时,能快速重试,让用户可以快速拿到结果。而不是一直卡着,使得上层应用阻塞等待。
这个功能可以通过设置下面的3个超时参数、超时重试次数来实现。在超时的时候,立即主动断开,并重试。可以在当前集群上重试,也可以切换集群重试。
二、3个超时参数及其机制
hbase.rpc.timeout
hbase client和server之间通过 rpc 通信,此参数设置了rpc超时时间。超时后将主动断开 rpc 请求。
hbase.client.opeation.timeout
hbase client从发出数据操作请求到server端处理完成并返回,总时间不能超过此参数。一个数据请求可能会调用多次rpc请求。比如 client 端发起了一个 put 请求,server 端正好在Full gc ,导致 rpc 响应超时。那么 client 会进行重试,重试多次后,累计的时间超过了 client.opeation.timeout 后,将抛出 sockettimeout 异常。
hbase.client.scanner.timeout.period
hbase 为 scanner 专门设置的超时参数。
一次 scan 操作如果一次性返回大量数据,对于 client 和 server 还有网络都有很大的压力。client 端一次性接受大量数据放在内存中,容易oom; server 端从磁盘读出数据需要大量的io,而我们知道io 相比于cpu、内存,往往更容易成为瓶颈;网络端从 server 这台机器传输大量数据到 client 这台机器,将会占用很大带宽,对网络也有压力。
因此 一个scan 操作会分为多次 rpc 来实现。 我们在 scan 的时候,会设置 maxsize 和 cache,maxsize 表示本次 scan 要扫描返回的总条数,cache 表示一次 rpc 返回的数据条数。
HTable table=(HTable) getHTablePool().getTable("tb_stu");
Scan scan=new Scan();
scan.setMaxResultSize(10000);
scan.setCacheing(500);
ResultScanner rs = table.getScanner(scan);
Result r = rs.next();
每执行一次 rs.next(),都是在发起一次 rpc 请求。
server 端会比较 hbase.client.scanner.timeout.period 和 hbase.rpc.timeout 两个参数,按照其中较小的来判断是否超时。比如scanner.timeout.period 设置为6000ms,rpc.timeout为3000ms,则在超过3000ms时,就会报socketTimeout异常,主动断开连接。
ref:
hbase客户端超时机制:http://hbasefly.com/2016/06/11/hbase-client-2/
设置rpc超时后无效的解决方法:https://stackoverflow.com/questions/30923351/hbase-client-rpc-timeout
版权归原作者 titake 所有, 如有侵权,请联系我们删除。