HBase客户端Rpc的重试机制以及客户端参数优化。

hbase客户端重试机制如何保证系统的容错性和低延迟性
HBase客户端Rpc的重试机制以及客户端参数优化。
HBase客户端基于退避算法的重试机制
1、业务用户一方面比较关注HBase本身服务的读写性能:吞吐量以及读写延迟,
2、另一方面也会比较关注HBase客户端使用上的问题,主要集中在两个方面:是否提供了重试机制来保证系统操作的容错性?是否有必要的超时机制保证系统能够fastfail,保证系统的低延迟特性?
3、HBase客户端提供的重试机制,并通过配置合理的参数使得客户端在保证一定容错性的同时还能够保证系统的低延迟特性。

RpcRetryingCall函数是Rpc请求重试机制的实现,所以可以有两点推断:
1、HBase客户端请求在那个时间段网络有异常导致rpc请求失败,进入重试逻辑
2、根据HBase的重试机制(退避机制),每两次重试机制之间会休眠一段时间,即上图115行代码,这个休眠时间太长导致这个线程一直处于TIME_WAITING状态。

出现的将近几个小时的堵塞无请求,除非2中情况
情况1:配置有问题:需要客户端检查hbase.client.pause和hbase.client.retries.number两个参数配置出现异常,比如hbase.client.pause参数如果手抖配成了10000,就有可能出现几个小时阻塞的情况
//
HBase 客户端暂停
hbase.client.pause = 100 毫秒 默认
HBase 客户端最大重试次数
hbase.client.retries.number = 35 默认次数

情况2:网络持续有问题:如果线程1持有全局锁重试失败之后退出,线程2竞争到这把锁,此时网络依然有问题,线程2会再次进入重试,重试8min之后失败退出,循环下去,也有可能出现几个小时阻塞的情况
//小结:情况1 出现的概率很低,基本上出现 客户端请求无响应,堵塞无请求的情况,网络持续有问题是很大的原因。
通过监控和小伙伴确认之后发现:在事发当时(凌晨0点~早上6点)确实存在很多服务因为云网络升级异常发生抖动的情况出现。

HBase Rpc重试机制

HBase的重试机制是这次异常发生的关键点,有必要对其进行一次解析。HBase执行rpc失败之后会执行重试操作,
重试的最大次数可以通过配置文件配置,对应的参数为hbase.client.retries.number,0.98版本中该参数的默认值为31。
//在一定时间内,不断的重试后,还没有成功响应的话,最后会放弃连接到集群

客户端参数优化实践

很显然,根据上面第二部分和第三部分的介绍,一旦在网络出现抖动的异常情况下,默认最差情况下一个线程会存在8min左右的重试时间,从而会导致其他线程都阻塞在regionLockObject这把全局锁上。为了构建一个更稳定、低延迟的HBase系统,除过需要对服务器端参数做各种调整外,客户端参数也需要做相应的调整:

  1. hbase.client.pause:默认为100,可以减少为50
    //cdh中 HBase 客户端暂停
    hbase.client.pause = 100毫秒
  2. hbase.client.retries.number:默认为31,可以减少为21
    //HBase 客户端最大重试次数
    hbase.client.retries.number = 35

修改后,通过上面算法可以计算出每次连接集群重试之间的暂停时间将依次为:
[50,100,150,250,500,1000,2000,5000,5000,5000,5000,10000,10000,…,10000]
客户端将会在2min内重试20次,然后放弃连接到集群,进而会再将全局锁交给其他线程,执行其他请求。

详细讲解了HBase Rpc的重试机制以及客户端参数优化。

参考链接
HBase最佳实践 – 客户端重试机制 http://hbasefly.com/2016/06/04/hbase-client-1/

原文地址:https://blog.51cto.com/12445535/2373709

时间: 2024-10-11 13:37:45

HBase客户端Rpc的重试机制以及客户端参数优化。的相关文章

想深入了解TCP机制和相关参数优化吗(下)

上篇中,我们介绍了TCP的协议头.状态机.数据重传中的东西.但是TCP要解决一个很大的事,那就是要在一个网络根据不同的情况来动态调整自己的发包的速度,小则让自己的连接更稳定,大则让整个网络更稳定.在你阅读下篇之前,你需要做好准备,本篇文章有好些算法和策略,可能会引发你的各种思考,让你的大脑分配很多内存和计算资源,所以,不适合在厕所中阅读. TCP的RTT算法 从前面的TCP的重传机制我们知道Timeout的设置对于重传非常重要, 设长了,重发就慢,没有效率,性能差: 设短了,重发的就快,会增加网

GlusterFS 客户端与服务器端仲裁机制对比

客户端仲裁只适用于副本卷,服务器仲裁适用于所有卷. 副本卷个数最好为奇数个,服务器端个数最好为不小于3的奇数. 客户端仲裁 客户端仲裁适用于fuse.gfapi.nfs. 客户端仲裁功能是在AFR中继器中实现,所以只要该中继器被加载,就能提供客户端仲裁功能. 仲裁检测自然由AFR中继器负责. 如果检查失败,客户端则无法写入,返回EROFS错误. 正在进行写操作会因为板块(brick)数未达到仲裁要求的数量而失败,并且FOP会返回EROFS错误,后续的写操作会返回相同的错误,所以,这种情形下的错误

ASP.NET 表单验证方法与客户端(浏览器)服务器交互机制的故事

想到这个问题完全是一个意外吧,是在寻找另外一个问题答案的过程中,才对验证方法与浏览器服务器交互机制的关系有了清晰的认识. 先说下验证方法,验证方法分为前台验证和后台验证. 前台验证就是类似jQuery.Validate这类的插件,当然也可以我们自己写. 后台验证就是ASP.NET自带的验证控件,如RequiredFieldValidator. 记得初学.NET的时候,那会儿接触验证控件,也知道验证分为前台,后台.但是随着时间的推移,由于做的项目基本上都是公司内部使用的软件,比如OA.因为这种项目

客户端识别和cookie机制

HTTP最初是一个匿名的.无状态的请求,服务器处理来自客户端的请求,然后向客户端回送响应,web服务器几乎没有什么信息来判定是哪个用户发送的请求,也无法记录用户的请求序列,以下有几种方法来增加用户识别机制: 第一.HTTP首部 1.from首部:包含了E-mail地址 2.User-Agent:包含了浏览器相关信息,包括程序的名称和版本, 3.Referer:提供了用户来源页面的URL 第二.客户端的IP地址: 通过TCP链接得到IP地址,存在的问题: 客户端IP地址描述的所用的机器,而不是用户

jedis超时重试机制注意事项

最近使用redis集群进行incr操作,总是发现计数不准确,后来经过检查发现redis在执行incr超时会执行重试机制,造成计数不准确,测试代码: /** * incrf: * 将 key 中储存的数字值增一. 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作. 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误. 本操作的值限制在 64 位(bit)有符号数字表示之内. 这是一个针对字符串的操作,因为 Redis 没有专用的整数类型,

HBase中MVCC的实现机制及应用情况

MVCC(Multi-Version Concurrent Control),即多版本并发控制协议,广泛使用于数据库系统.本文将介绍HBase中对于MVCC的实现及应用情况. MVCC基本原理 在介绍MVCC概念之前,我们先来想一下数据库系统里的一个问题:假设有多个用户同时读写数据库里的一行记录,那么怎么保证数据的一致性呢?一个基本的解决方法是对这一行记录加上一把锁,将不同用户对同一行记录的读写操作完全串行化执行,由于同一时刻只有一个用户在操作,因此一致性不存在问题.但是,它存在明显的性能问题:

NFS客户端访问行为相关的几个参数解释

soft / hard Determines the recovery behavior of the NFS client after an NFS request times out. If neither option is speci- fied (or if the hard option is specified), NFS requests are retried indefinitely. If the soft option is speci- fied, then the N

【Dubbo 源码解析】07_Dubbo 重试机制

Dubbo 重试机制 通过前面 Dubbo 服务发现&引用 的分析,我们知道,Dubbo 的重试机制是通过 com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker 来实现的: public Result doInvoke(Invocation invocation, final List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcExce

Volley超时重试机制详解

Volley超时重试机制 基础用法 Volley为开发者提供了可配置的超时重试机制,我们在使用时只需要为我们的Request设置自定义的RetryPolicy即可. 参考设置代码如下: int DEFAULT_TIMEOUT_MS = 10000; int DEFAULT_MAX_RETRIES = 3; StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<S