记录Hbase get查询的一些坑

本次的业务是基于短信发送之前,去做黑名单的校验和发送内容的检测,因此,在进行下一步业务之前,我需要等待黑名单的查询结果,由于线上环境的Hbase出故障,导致整个业务堵塞,因此,想到了对hbase异常做上容错机制,因此,有了以下的内容

try {
    counts = hbaseService.get("cmcc_sms_blacklist",serviceId,"counts","count");
} catch (Exception e) {
    logger.error("hbaseservice error",e);
    return true;
}

但是在实际运行中,

我发现会堵在这个查询语句这里,不会进入异常,因此,我的异常只是个摆设而已,那我便猜想,是由于这个get查询,是组赛式查询,如何才能让它跳出来

翻阅一些文献,才知道,这个查询也是涉及到了hbase的重试

具体有以下几个参数:

hbase.client.operation.timeout: 2000
hbase.rpc.timeout: 2000
hbase.client.retries.number: 3

hbase.client.pause

默认的HBase客户端的参数配置是没有做过优化的,所以对于低延时响应的HBase集群,需要对客户端的参数进行优化。

1.      hbase.rpc.timeout

以毫秒计算的所有HBase RPC超时,默认为60s。

该参数表示一次RPC请求的超时时间。如果某次RPC时间超过该值,客户端就会主动关闭socket。

如果经常出现java.io.IOException: Connection reset by peer异常问题,估计HBase集群出现了大量高并发读写业务或者服务器端发生了比较严重的Full GC等问题,导致某些请求无法得到及时处理,超过了设置的时间间隔。

根据实际情况,可以修改为5000,即5s。

2.      hbase.client.retries.number

客户端重试最大次数。所有操作所使用的最大次数,例如,从根 RegionServer 获取根区域、获取单元格的值和启动行更新。

默认为35,可以设置为3。

3.     hbase.client.pause

通用客户端暂停时间值(重试的休眠时间)。重试get失败或区域查找等操作前,经常使用的等待时间段。

HBase1.1版本开始此值默认为100ms,比较合理,如果你的版本不是,建议修改此值为100ms。

4.      zookeeper.recovery.retry

zookeeper的重试次数,可调整为3次,zookeeper不轻易挂,且如果HBase集群出问题了,每次重试均会对zookeeper进行重试操作。

zookeeper的重试总次数是:

hbase.client.retries.number * zookeeper.recovery.retry。

并且每次重试的休眠时间均会呈2的指数级增长,每次访问HBase均会重试,在一次HBase操作中如果涉及多次zookeeper访问,则如果zookeeper不可用,则会出现很多次的zookeeper重试,非常浪费时间。

5.      zookeeper.recovery.retry.intervalmill

zookeeper重试的休眠时间,默认为1s,可以减少,比如:200ms。

6.      hbase.client.operation.timeout

该参数表示HBase客户端发起一次数据操作直至得到响应之间总的超时时间,数据操作类型包括get、append、increment、delete、put等。很显然,hbase.rpc.timeout表示一次RPC的超时时间,而hbase.client.operation.timeout则表示一次操作的超时时间,有可能包含多个RPC请求。

举个例子说明,比如一次Put请求,客户端首先会将请求封装为一个caller对象,该对象发送RPC请求到服务器,假如此时因为服务器端正好发生了严重的Full GC,导致这次RPC时间超时引起SocketTimeoutException,对应的就是hbase.rpc.timeout。那假如caller对象发送RPC请求之后刚好发生网络抖动,进而抛出网络异常,HBase客户端就会进行重试,重试多次之后如果总操作时间超时引起SocketTimeoutException,对应的就是hbase.client.operation.timeout。

默认为1200000,可以设置为30000,即30s。

7.      hbase.regionserver.lease.period

hbase.client.operation.timeout参数规定的超时基本涉及到了HBase所有的数据操作,唯独没有scan操作。然而scan操作却是最有可能发生超时的,也是用户最为关心的。HBase特别考虑到了这点,并提供了一个单独的超时参数进行设置:hbase.client.scanner.timeout.period。

此参数指scan查询时每次与RegionServer交互的超时时间。

默认为60s,可不调整。

 

了解到这些后,想到我的dubbo服务端,超时时间是3秒,那么我就需要选择合适的参数进行调参,我主要设置了以下几个参数:

然后,进入Hbase服务器,停止hbase服务

看过我之前博客的小伙伴,就能见到这个熟悉的异常了,好,hbase已经停掉了,然后可以开始我们的试验了

发送短信,看到会延迟一会,然后正常返回,再去看看我们的日志部分

熟悉的error,已经进入我们的异常了,还能看到我们设置生效的一些参数

最后,我们还要验证,hbase启动之后,能否恢复异常

好,我们启动hbase,然后发业务,看日志

熟悉的 tohbase 日志

至此,填坑结束。。。。。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值