本文共 3821 字,大约阅读时间需要 12 分钟。
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 = 0zookeeper.recovery.retry.intervalmill = 3000hbase.zookeeper.recoverable.waittime = 1000zookeeper.session.timeout = 30000hbase.rpc.timeout = 10000hbase.client.retries.number = 1hbase.client.rpc.maxattempts = 1hbase.client.operation.timeout = 10000HBase Client Scanner Timeout
hbase.client.scanner.timeout.period = 1分钟HBase Region Server 租赁周期hbase.regionserver.lease.period, hbase.client.scanner.timeout.period = 1 分钟//cdh 默认设置为 RPC 超时
hbase.rpc.timeout = 1分钟 从字面意思就可知道,该参数表示一次RPC请求的超时时间。如果某次RPC时间超过该值,客户端就会主动关闭socket。此时,服务器端就会捕获到如下的异常:java.io.IOException: Connection reset by peer上述异常经常发生在大量高并发读写业务或者服务器端发生了比较严重的Full GC等场景下,导致某些请求无法得到及时处理,超过了时间间隔。该值默认大小为60000ms,即1min。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操作。//cdh中
HBase Client Scanner Timeouthbase.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、一旦发生超时异常,很多童鞋的第一反应是会将超时时间设长。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请求一次参考链接为:
转载于:https://blog.51cto.com/12445535/2373731