hbase 客户端超时机制参数优化实践

hbase 客户端超时机制参数优化实践

1、介绍了HBase客户端基于退避算法的重试机制,并分析得出在某些场景下如果重试策略设置不当会导致长时间的业务阻塞。
2、除了重试机制外,业务童鞋最关心的就是超时机制了。
3、客户端超时设置对整个系统的稳定性以及敏感性至关重要,一旦没有超时设置或超时时间设置过长,服务器端的长时间卡顿必然会引起客户端阻塞等待,进而影响上层应用。
4、好在HBase提供了多个客户端参数设置超时,主要包括 hbase.rpc.timeout / hbase.client.operation.timeout / hbase.client.scanner.timeout.period。
5、然而这些参数官方并没有给出具体的介绍,导致开发人员并不真正理解这些参数的含义。接下来本文分别对这三个参数进行介绍,应用童鞋可以根据自己的实际情况对这三个参数进行设置。
//
RPC 超时
hbase.rpc.timeout = 1 分钟 默认
Service Monitor 客户端配置替代
分为
zookeeper.recovery.retry = 0
zookeeper.recovery.retry.intervalmill = 3000
hbase.zookeeper.recoverable.waittime = 1000
zookeeper.session.timeout = 30000
hbase.rpc.timeout = 10000
hbase.client.retries.number = 1
hbase.client.rpc.maxattempts = 1
hbase.client.operation.timeout = 10000

HBase Client Scanner Timeout
hbase.client.scanner.timeout.period = 1分钟
HBase Region Server 租赁周期
hbase.regionserver.lease.period, hbase.client.scanner.timeout.period = 1 分钟

hbase.rpc.timeout

//cdh 默认设置为 RPC 超时
hbase.rpc.timeout = 1分钟
从字面意思就可知道,该参数表示一次RPC请求的超时时间。如果某次RPC时间超过该值,客户端就会主动关闭socket。此时,服务器端就会捕获到如下的异常:java.io.IOException: Connection reset by peer
上述异常经常发生在大量高并发读写业务或者服务器端发生了比较严重的Full GC等场景下,导致某些请求无法得到及时处理,超过了时间间隔。该值默认大小为60000ms,即1min。

hbase.client.operation.timeout

1、该参数表示HBase客户端发起一次数据操作直至得到响应之间总的超时时间,数据操作类型包括get、append、increment、delete、put等。
2、很显然,hbase.rpc.timeout表示一次RPC的超时时间,
3、而hbase.client.operation.timeout则表示一次操作的超时时间,有可能包含多个RPC请求。
提示:
1、假如此时因为服务器端正好发生了严重的Full GC,导致这次RPC时间超时引起SocketTimeoutException,对应的就是hbase.rpc.timeout。
2、那假如caller对象发送RPC请求之后刚好发生网络抖动,进而抛出网络异常,HBase客户端就会进行重试,重试多次之后如果总操作时间超时引起SocketTimeoutException,对应的就是hbase.client.operation.timeout。
3、hbase.client.operation.timeout参数规定的超时基本涉及到了HBase所有的数据操作,唯独没有scan操作。

hbase.client.scanner.timeout.period

//cdh中
HBase Client Scanner Timeout
hbase.client.scanner.timeout.period = 1 分钟
Scanner Timeout, in milliseconds, for HBase Clients. Scanner related RPCs will apply this timeout against the RegionServers they talk to.
1、scan操作却是最有可能发生超时的,也因此是用户最为关心的。HBase当然考虑到了这点,并提供了一个单独的超时参数进行设置:hbase.client.scanner.timeout.period。
2、这个参数理解起来稍微有点复杂,需要对scan操作本身有比较全面的理解,这可能也是很多业务用户并不了解的地方。

提示:
1、很多人都会误认为一次scan操作就是一次RPC请求其实是多次的RPC请求,实际上,一次请求大量数据的scan操作可能会导致多个很严重的后果:
2、服务器端可能因为大量io操作导致io利用率很高,影响其他正常业务请求;大量数据传输会导致网络带宽等系统资源被大量占用;客户端也可能因为内存无法缓存这些数据导致OOM。
3、基于此,HBase会将一次大的scan操作根据设置条件拆分为多个RPC请求,每次只返回规定数量的结果。
4、上述代码中foreach(Result r :rs)语句实际上等价于Result r = rs.next(),每执行一次next()操作就会调用客户端发送一次RPC请求,参数hbase.client.scanner.timeout.period就用来表示这么一次RPC请求的超时时间,默认为60000ms,一旦请求超时,就会抛出SocketTimeoutException异常。

讲到这里,就借用宝地引申地讲讲另外两个相关的问题:

  1. 上文提到一次大的scan操作会被拆分为多个RPC请求,那到底会拆分为多少个呢?
  2. 经常有业务童鞋问道,在scan过程中RegionServer端偶尔抛出leaseException,是怎么回事?
    hbase.regionserver.lease.period
    //cdh中 默认为1分钟
    HBase Region Server 的租赁周期(以毫秒为单位)。客户端必须在此周期内报告,否则会被认为未活动。
    //租约机制就是为了解决这个问题。RegionServer接收到第一次RPC之后,除了生成全局唯一的scanId之外还会生成一个携带有超时时间的lease,超时时间可以通过参数hbase.regionserver.lease.period配置,一旦在超时时间内后续RPC请求没有到来(比如客户端处理太慢),RegionServer就认为客户端出现异常,此时会将该lease销毁并将整个scan所持有的资源全部释放,客户端在处理完成之后再发后续的RPC过来,检查到对应的lease已经不存在,就会抛出如下leaseExcption:

小结:
1、一旦发生超时异常,很多童鞋的第一反应是会将超时时间设长。
2、可以负责任的说,这样的处理是盲目的,不仅不能从本质上解决问题,还会使得整个系统处于特别不敏感的状态,
3、在某些异常情况下,客户端就会因为超时时间设置太长而一直阻塞,进而导致上层业务长时间卡顿。
4、因此在大多数情况下都不建议将超时时间设大,推荐的方法是找到超时的原因,分析超时原因是否可以避免。

文章最后再说说如何设置超时,用户可以通过修改配置文件hbase-site.xml来设置这几个参数,也可以通过代码的方式进行设置,如下所示:

Confiuration conf = HBaseConfiguration.create();
conf.setInt("hbase.rpc.timeout",20000);
conf.setInt("hbase.client.operation.timeout”,30000);
conf.setInt("hbase.client.scanner.timeout.period",20000);
HTable table = new HTable(conf,"tableName");

小伙伴的问题1:
文章中的“代码中foreach(Result r :rs)语句实际上等价于Result r = rs.next(),每执行一次next()操作就会调用客户端发送一次RPC请求”;当设置scan.setCacheing(500)后,一次rpc会获取到500条数据,但是Result r = rs.next() 这不是一条数据吗?
答:
一次cache(500)是说客户端发送请求给rs rs会给客户端返回500条数据 客户端会将这500条数据缓存在本地。next会一条一条从本地缓存中取数据直至取完,取完后客户端又会向rs请求一次

参考链接为:
http://hbasefly.com/2016/06/11/hbase-client-2/

转载于:https://blog.51cto.com/12445535/2373731

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值