客户端超时设置对整个系统的稳定性以及敏感性至关重要,一旦没有超时设置或超时时间设置过长,服务器端的长时间卡顿必然会引起客户端阻塞等待,进而影响上层应用。好在HBase提供了多个客户端参数设置超时,主要包括 hbase.rpc.timeout / hbase.client.operation.timeout/ hbase.client.scanner.timeout.period

一 hbase.rpc.timeout

表示一次RPC请求的超时时间,如果某一次RPC请求超过该值,客户端就会主动关闭socket,此时服务器端就会捕获到如下的异常:

上述异常经常发生在大量高并发读写业务或者服务器端发生了比较严重的Full GC等场景下,导致某些请求无法得到及时处理,超过了时间间隔。该值默认大小为60000ms,即1min。

二 hbase.client.operation.timeout

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

三 hbase.client.scanner.timeout.period

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

period

publicList<String> scan(StringtableName,String startRow, StringstopRow,String family, Stringqualifier) throws IOException{

if (StringUtils.isBlank(tableName)) {

System.err.println("table isblank!");

return null;

}

if (StringUtils.isBlank(family)) {

System.err.println("family isblank!");

return null;

}

if (StringUtils.isBlank(qualifier)) {

System.err.println("qualifieris blank!");

return null;

}

Scanscan = newScan(Bytes.toBytes(startRow), Bytes.toBytes(stopRow));

TableNametn= TableName.valueOf(tableName);

Table table = this.conn.getTable(tn);

ResultScanner scanner = table.getScanner(scan);

List<String> valList = new ArrayList<String>();

Stringdata = null;

for (Result : scanner) {

byte[] arr =result.getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier));

data = Bytes.toString(arr);

valList.add(data);

}

table.close();

return valList;

}

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

四 scan 请求是怎么拆分的呢?

一次scan请求的RPC次数主要和两个因素相关,一个是本次scan的待检索条数,另一个是单次RPC请求的数据条数,很显然,两者的比值就是RPC请求次数。

一次scan的待检索条数由用户设置的条件决定,比如用户想一次获取某个用户最近一个月的所有操作信息,这些信息总和为10w条,那一次scan总扫瞄条数就是10w条。为了防止一次scan操作请求的数据量太大,额外提供了参数maxResultSize对总检索结果大小进行限制,该参数表示一次scan最多可以请求的数据量大小,默认为-1,表示无限制。

单次RPC请求的数据条数由参数caching设定,默认为100条。因为每次RPC请求获取到数据都会缓存到客户端,因此该值如果设置过大,可能会因为一次获取到的数据量太大导致客户端内存oom;而如果设置太小会导致一次大scan进行太多次RPC,网络成本高。

五 在scan过程中RegionServer端偶尔抛出leaseException

看到leaseException就会想到租约机制,的确,HBase内部在一次完整的scan操作中引入了租约机制。为什么需要租约机制?这和整个scan操作流程有莫大的关系,上文讲到,一次完整的scan通常会被拆分为多个RPC请求,实际实现中,RegionServer接收到第一次RPC请求之后,会为该scan操作生成一个全局唯一的id,称为scanId。除此之外,RegionServer还会进行大量的准备工作,构建整个scan体系,构造需要用到的所有对象,后续的RPC请求只需要携带相同的scanId作为标示就可以直接利用这些已经构建好的资源进行检索。也就是说,在整个scan过程中,客户端其实都占用着服务器端的资源,此时如果此客户端意外宕机,是否就意味着这些资源永远都不能得到释放呢?租约机制就是为了解决这个问题。RegionServer接收到第一次RPC之后,除了生成全局唯一的scanId之外还会生成一个携带有超时时间的lease,超时时间可以通过参数hbase.regionserver.lease.period配置,一旦在超时时间内后续RPC请求没有到来(比如客户端处理太慢),RegionServer就认为客户端出现异常,此时会将该lease销毁并将整个scan所持有的资源全部释放,客户端在处理完成之后再发后续的RPC过来,检查到对应的lease已经不存在,就会抛出如下leaseExcption:

HBase之超时机制相关推荐

  1. 【HBase学习之四】HBase Client超时机制优化

    生产服务遇到过一个故障,大体来说就是hbase集群故障,在没有设置hbase客户端超时的情况下,导致大量线程阻塞,从而影响了tomcat对其他服务请求的正常响应(504网关超时,超时率30%),需要规 ...

  2. HBase之重试机制

    在运维HBase的这段时间里,发现业务用户一方面比较关注HBase本身服务的读写性能:吞吐量以及读写延迟,另一方面也会比较关注HBase客户端使用上的问题,主要集中在两个方面:是否提供了重试机制来保证 ...

  3. 关于Hystrix超时机制和线程状态的测试观察和个人理解

    作者:未完成交响曲,资深Java工程师!目前在某一线互联网公司任职,架构师社区合伙人! 我们在使用Hystrix时,大部分情况下都是直接基于SpringCloud的相关注解来完成请求调用的.我们有个项 ...

  4. golang net/http 超时机制完全手册

    目录 SetDeadline 服务器端超时设置 客户端超时设置 Cancel 和 Context 英文原始出处: The complete guide to Go net/http timeouts, ...

  5. .Net Cancellable Task - APM异步超时机制扩展

    概述 .NET基于委托的APM(Asynchronous Programming Model)模式通过BeginInvoke, EndInvoke, AsyncCallback,IAsyncResul ...

  6. 超时机制,断路器模式简介

    使用Hystrix保护应用,它是一种豪猪,他身上有很多的刺,所以他能保护自己,我们知道老外的项目,他的项目名称往往取得比较有格调,比较的生动形象,所以他可以保护这样的一个组件,起名叫Hystrix,我 ...

  7. mysql会话超时机制_mysql超时机制

    mysql每次建立一个socket连接(connect)时,这个socket都会占用一定内存.即使你关闭(close)连接时,并不是真正的关闭,而是处于睡眠(sleep)状态. 当你下次再进行连接时, ...

  8. java netty swap高_Netty 超时机制及心跳程序实现

    本文介绍了 Netty 超时机制的原理,以及如何在连接闲置时发送一个心跳来维持连接. Netty 超时机制的介绍 Netty 的超时类型 IdleState 主要分为: ALL_IDLE : 一段时间 ...

  9. golang mysql 超时_Go语言channel超时机制

    Go语言没有提供直接的超时处理机制,所谓超时可以理解为当我们上网浏览一些网站时,如果一段时间之后不作操作,就需要重新登录. 那么我们应该如何实现这一功能呢,这时就可以使用 select 来设置超时. ...

最新文章

  1. 字符串匹配-BM算法改进SUNDAY--Boyer-Moore-Horspool-Sunday Aglorithm
  2. 全国计算机等级考试题库二级C操作题100套(第23套)
  3. Django Form -- 字段的用法扩展
  4. Android官方开发文档Training系列课程中文版:分享文件之配置文件共享
  5. java中DatagramSocket连续发送多个数据报包时产生丢包现象解决方案
  6. canvas笔记-阴影的使用
  7. Docker入门与应用系列(二)镜像管理
  8. 两平面平行但不重合的条件是_____「初一数学」平行线的判定与性质的综合应用...
  9. matlab求两向量夹角_Matlab-自动化控制系统设计4频域分析
  10. 计算机相关专业试题,计算机基础类 模拟试题 计算机相关专业 模拟题 10套 附答案.doc...
  11. ie6,ie7兼容性总结
  12. Solr基础教程之solrconfig.xml(三)
  13. 几个轻巧好用的代码检查工具!代码不在坏味道
  14. 【WIN】【C++】遍历文件夹下所有文件
  15. apple 证书 账号 内购 详解
  16. 北京智源大会 | AI + 医疗的下一个十年:从公共卫生预警到人类基因密码解析 道翰天琼认知智能api机器人接口。
  17. python反距离权重法_先从IDW(反距离权重)插值开始吧
  18. 长春师范大学计算机科学与技术团委,计算机科学与技术系团总支学生分会纳新公告...
  19. Qt uchar *转 Hex的QString方法代码
  20. Win7文件右下角盾牌标志去除方法---UAC阻止程序运行

热门文章

  1. elasticsearch新增_SpringBoot 使用JestClient操作Elasticsearch
  2. Docker及K8S使用碎碎记
  3. 多个折线样式_新技能get,折线图转化成多阶梯瀑布图
  4. PostgreSQL 12系统表(6)pg_namespace
  5. 我将要关注的kaggle比赛
  6. python树的实现
  7. Python利用双端队列判断回文词
  8. 三星w2014android,三星W2014评测:机身细节及内部设计
  9. linux 线程 waitforsingleobject,用Sleep或WaitForSingleObject实现线程的休眠 | 求索阁
  10. 计算机维修法宝,计算机的三大法宝