HBase最佳实践-客户端超时机制

HBase-客户端-超时机制设置 背景 当用户有一些大请求的时候,会报超时,但是用户觉得请求慢一些也能接受,如何设置? 如果用户觉得HBase默认超时时间太长,希望请求超过一定毫秒数就报超时退出来,而不是一直在等待,如何设置? 入手 从网上搜索可以看到很多有关hbase客户端超时设置的参数说明 不过并不是非常详细 不过至少我们能定位到这几个参数,以进行入手 hbase.rpc.time... 阅读详情

上篇博文结合一起线上问题介绍了HBase客户端基于退避算法的重试机制,并分析得出在某些场景下如果重试策略设置不当会导致长时间的业务阻塞。除了重试机制外,业务童鞋最关心的就是超时机制了。客户端超时设置对整个系统的稳定性以及敏感性至关重要,一旦没有超时设置或超时时间设置过长,服务器端的长时间卡顿必然会引起客户端阻塞等待,进而影响上层应用。好在HBase提供了多个客户端参数设置超时,主要包括 hbase.rpc.timeout / hbase.client.operation.timeout / hbase.client.scanner.timeout.period。然而这些参数官方并没有给出具体的介绍,导致开发人员并不真正理解这些参数的含义。接下来本文分别对这三个参数进行介绍,应用童鞋可以根据自己的实际情况对这三个参数进行设置。

hbase.rpc.timeout

从字面意思就可知道,该参数表示一次RPC请求的超时时间。如果某次RPC时间超过该值,客户端就会主动关闭socket。此时,服务器端就会捕获到如下的异常:

java.io.IOException: Connection reset by peer
        at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
        at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
        at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
        at sun.nio.ch.IOUtil.read(IOUtil.java:197)
        at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:384)
        at org.apache.hadoop.hbase.ipc.RpcServer.channelRead(RpcServer.java:2246)
        at org.apache.hadoop.hbase.ipc.RpcServer$Connection.readAndProcess(RpcServer.java:1496)
....
2016-04-14 21:32:40,173 WARN  [B.DefaultRpcServer.handler=125,queue=5,port=60020] ipc.RpcServer: RpcServer.respondercallId: 7540 service: ClientService methodName: Multi size: 100.2 K connection: 10.160.247.139:56031: output error
2016-04-14 21:32:40,173 WARN  [B.DefaultRpcServer.handler=125,queue=5,port=60020] ipc.RpcServer: B.DefaultRpcServer.handler=125,queue=5,port=60020: caught a ClosedChannelException, this means that the server was processing a request but the client went away. The error message was: null

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


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。


hbase.client.scanner.timeout.period

看到这里为止,很多细心的童鞋都会发现,hbase.client.operation.timeout参数规定的超时基本涉及到了HBase所有的数据操作,唯独没有scan操作。然而scan操作却是最有可能发生超时的,也因此是用户最为关心的。HBase当然考虑到了这点,并提供了一个单独的超时参数进行设置:hbase.client.scanner.timeout.period。这个参数理解起来稍微有点复杂,需要对scan操作本身有比较全面的理解,这可能也是很多业务用户并不了解的地方。

首先,我们来看一个最简单的scan操作示例:

public static void scan() {
   HTable table=(HTable) getHTablePool().getTable("tb_stu");  
   Scan scan=new Scan(); 
   scan.setMaxResultSize(10000); 
   scan.setCacheing(500);
   ResultScanner rs = table.getScanner(scan);
   for (Result r : rs) {
      for (KeyValue kv : r.raw()) {
          System.out.println(String.format("row:%s, family:%s, qualifier:%s, qualifiervalue:%s,   timestamp:%s.”,
                  Bytes.toString(kv.getRow()),
                  Bytes.toString(kv.getFamily()),  
                  Bytes.toString(kv.getQualifier()),
                  Bytes.toString(kv.getValue()),
                  kv.getTimestamp()));
      }
   }
}

很多人都会误认为一次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异常。


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

1.  上文提到一次大的scan操作会被拆分为多个RPC请求,那到底会拆分为多少个呢?

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

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

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

具体使用可以参考上文代码示例。

2. 经常有业务童鞋问道,在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:

org.apache.hadoop.hbase.regionserver.LeaseException: lease '-8841369309248784313’ does not exist  
      at org.apache.hadoop.hbase.regionserver.Leases.removeLease(Leases.java:230)  
      at org.apache.hadoop.hbase.regionserver.HRegionServer.next(HRegionServer.java:1847)  
      at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)  
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
      at java.lang.reflect.Method.invoke(Method.java:597)  
      at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:570)
      at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1039) 

写在最后

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

文章最后再说说如何设置超时,用户可以通过修改配置文件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");
…
一个HBase客户端超时问题的排查 最近处理了一个客户端scan超时问题,记录在此,希望能够帮助到遇到同样问题的同学。 问题的错误堆栈如下面所示: java.lang.RuntimeException: org.apache.hadoop.hbase.client.ScannerTimeoutException: 76745ms passed since the last invocation, timeout is c 阅读详情

相关推荐

从Keytab到Token:HBase安全认证演进史与最佳实践

本文深入探讨了HBase安全认证从Kerberos Keytab到Token的演进历程与最佳实践。详细解析了Kerberos认证机制及其24小时失效问题,介绍了Hadoop 3.x引入的Delegation Token解决方案,并针对不同规模企业提供了认证策略建议,帮助开发者构建更安全、稳定的HBase环境。

weixin_29198045的博客 631

hbase_使用中遇到的问题(CallTimeoutException)

1. CallTimeoutException Caused by: java.net.SocketTimeoutException: callTimeout=60000, callDuration=139094: row '' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=hykj-slave-4,60040...

子龙修仙的博客 2万+

TensorRT(C++)部署 Pytorch模型

众所周知,python训练pytorch模型得到.pt模型。但在实际项目应用中,特别是嵌入式端部署时,受限于语言、硬件算力等因素,往往需要优化部署,而tensorRT是最常用的一种方式。本文以yolov5的部署为例,说明模型部署在x86架构上的电脑端的流程。(部署在Arm架构的嵌入式端的流程类似)。

女神sha手的博客 5405

HBase优化

一、IOT表的优化 1、IOT表现状 IOT数据采集表 采集IOT设备每秒钟数据,存入hbase,rowkey为时间戳+设备名,按时间进行预分区; 其中,一张IOT表里,有10个设备每秒钟采集6个自己区域的监测值,一天的数据为10*(60*60*24) = 844000条数据 列为:每个设备的监测区域ID(如AacW6cTXG20、AacW6cTXG21、AacW6cTXG23…)+ 设备ID,一共10*6+1=61列。 如果,要通过Pheonix查询,需要在pheonix中建立相应映射

TU_JCN的博客 1137

Excel VBA--按某一列拆分数据到多个文件

首先,将需要拆分的sheet命名为“明细”,接下来运行此代码,按提示操作即可。 在这里插入代码片 Sub chaifen() '定义变量类型 Dim sht, sh1, sh2 As Worksheet Dim k, i, j As Integer Dim irow As Integer Dim col As Integer Dim str As String '程序开始是要求输入按哪一列拆分数...

weixin_43650026的博客 5873

LTX-2.3 V1.6:8G显存本地AI视频生成工具与int8量化加速实践

这次我们来看一个本地部署的AI视频生成工具——LTX-2.3文字图片生成带音频视频工具V1.6版本。这个工具最大的特点是支持int8量化加速,相比原版提速2-4倍,效果更好,而且8G显存就能运行,不需要搭建复杂环境,解压即可使用。 对于想要在本地电脑上快速生成带音频视频内容的用户来说,这个工具解决了几个关键痛点:首先是硬件门槛低,8G显存意味着大多数主流游戏显卡都能胜任;其次是部署简单,避免了Python环境配置、依赖包冲突等常见问题;最后是性能优化明显,int8加速让生成速度大幅提升。 本文会重点演示如何

hqmln的博客 1235

Hbase scanner.next() 查询未执行结束线程超时异常

ResultScanner scanner = htable.getScanner(scan); Result rs = scanner.next(); String line = ""; logger.info("DataScanner run rs:=" + rs); while (rs != null) { line = new String(rs.getValue(family, co...

胡杨的知识库 1217

SAP成本计划BAPI接口BAPI_COSTACTPLN_POSTPRIMCOST深度解析与实战指南

在SAP ERP系统中,成本计划是财务与控制模块的核心功能,它涉及对企业未来成本支出的预测与规划。其原理是通过结构化数据模型,将成本要素分配到具体的成本对象上,以实现预算编制和成本控制。这一技术的核心价值在于实现成本数据的标准化、自动化处理,从而提升财务流程效率与数据准确性。在应用场景上,成本计划广泛应用于年度预算编制、项目成本预测、系统间数据集成以及历史数据迁移等关键业务环节。本文聚焦于实现上述流程自动化的关键技术——SAP标准接口BAPI_COSTACTPLN_POSTPRIMCOST,并深入探讨其在高

weixin_29657209的博客 350

HBase之超时机制

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

happy19870612's blog 6141

从零开始学习CANoe(六)—— CAPL 测试节点

创建CAPL Test Module的两种方式

蚂蚁小兵 1万+

【AUTOSAR-RTE】-1-聊一聊RTE(Run-Time Environment)

RTE(Run-Time Environment)是AUTOSAR ECU架构的核心。

「汽车电子助手」的博客 6502

hbase scan超时设置_hbase 客户端超时、重连设置

1.设置的目的由于作为在线服务,需要能够保证在快速失败、失败容错重试等特性。快速失败能保证系统的低延时,能防止因为等待某个资源,造成服务资源暂用,最后导致服务不可用。失败容错能够提供服务的稳定性,进行服务失败是重试。因此Hbase客户端提供的重试机制,并通过配置合理的参数使得客户端在保证一定容错性的同时还能够保证系统的低延迟特性。2.hbase客户端重要参数hbase.client.pause失败...

weixin_32481609的博客 1304

组态王与SqlServer数据库交互总结

组态王可以与SqlServer、mysql、acess、oracle等数据库进行数据交互。 本文重点梳理了如何把组态王中的数据保存到SqlServer数据库中,并使用ADO控件对数据库中的数据进行查询。 一、数据存到SQL数据库 1.新建记录体 2、创建表格模板(用于创建数据库中的表格) 3、打开sqlserver,新建数据库 4、创建ODBC数据源 选择自己新建的数据库 5.使用SQLConnect函数连接数据库,SQLCraetTable函数用于在数据库中创建表格 6.使用

逍遥子的博客 2万+

网易视频云:HBase最佳实践-客户端超时机制

  现在,网易视频云与大家分享一下HBase最佳实践-客户端超时机制。  除了重试机制外,业务童鞋最关心的就是超时机制了。客户端超时设置对整个系统的稳定性以及敏感性至关重要,一旦没有超时设置或超时时间设置过长,服务器端的长时间卡顿必然会引起客户端阻塞等待,进而影响上层应用。好在HBase提供了多个客户端参数设置超时,主要包括hbase.rpc.timeout / hbase.client.ope...

vcloud163_2016的博客 255

[低代码 + AI] 明道云与 Dify 的三种融合实践方式详解

融合方式技术路径优点局限或注意事项UI 嵌入iframe 表单嵌入快速集成、用户体验一致无法自定义交互逻辑明道云调用 DifyAPI 请求节点工作流自动化、逻辑灵活有 timeout 限制、需优化 promptDify 调用明道云插件或 API 调用节点可查询实际业务数据、增强 AI 智能需理解明道云 API 结构、权限设置复杂明道云与 Dify 的结合为低代码平台注入了智能动力。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1187

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

hbase 客户端超时机制参数优化实践 1、介绍了HBase客户端基于退避算法的重试机制,并分析得出在某些场景下如果重试策略设置不当会导致长时间的业务阻塞。2、除了重试机制外,业务童鞋最关心的就是超时机制了。3、客户端超时设置对整个系统的稳定性以及敏感性至关重要,一旦没有超时设置或超时时间设置过长,服务器端的长时间卡顿必然会引起客户端阻塞等待,进而影响上层应用。4、好在HBase提供了多个客户端参...

weixin_33797791的博客 808

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

HBase最佳实践 – 客户端重试机制

在运维HBase的这段时间里,发现业务用户一方面比较关注HBase本身服务的读写性能:吞吐量以及读写延迟,另一方面也会比较关注HBase客户端使用上的问题,主要集中在两个方面:是否提供了重试机制来保证系统操作的容错性?是否有必要的超时机制保证系统能够fastfail,保证系统的低延迟特性? 这个系列我们集中介绍HBase客户端使用上的这两大问题,本文通过分析之前一个真实的案例来介绍HBase客户端...

qqqq0199181的博客 335

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

hbase 客户端超时、重连设置

1.设置的目的 由于作为在线服务,需要能够保证在快速失败、失败容错重试等特性。快速失败能保证系统的低延时,能防止因为等待某个资源,造成服务资源暂用,最后导致服务不可用。失败容错能够提供服务的稳定性,进行服务失败是重试。因此Hbase客户端提供的重试机制,并通过配置合理的参数使得客户端在保证...

cihongmo6452的博客 477

HBase客户端连接以及超时和租约机制分析

在使用HBase的时候客户端偶尔会出现超时等问题,所以本文打算简单分析下HBase客户端相关的源码,初步了解其中比较核心的机制。 客户端连接源码分析: Connection的创建: 程序中设置好HBase相关连接属性之后,调用ConnectionFactory.createConnection(conf)方法连接HBase。内部是使用反射的方法初始化对应类的: 该...

淡定一生2333的博客 2546

Hbase超时机制

上篇博文结合一起线上问题介绍了HBase客户端基于退避算法的重试机制,并分析得出在某些场景下如果重试策略设置不当会导致长时间的业务阻塞。除了重试机制外,业务童鞋最关心的就是超时机制了。客户端超时设置对整个系统的稳定性以及敏感性至关重要,一旦没有超时设置或超时时间设置过长,服务器端的长时间卡顿必然会引起客户端阻塞等待,进而影响上层应用。好在HBase提供了多个客户端参数设置超时,主要包括 hbase

何成俭的博客 2501

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

生产服务遇到过一个故障,大体来说就是hbase集群故障,在没有设置hbase客户端超时的情况下,导致大量线程阻塞,从而影响了tomcat对其他服务请求的正常响应(504网关超时,超时率30%),需要规避这个问题需要两个方面,1.设定客户端访问超时时间;2.服务资源隔离。本篇关注第一点。 hbase.rpc.timeout:一次RPC请求的超时时间,如果某次RPC时间超过该值,客户端就会主...

懂幸福,爱生活 2001

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

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

weixin_34240657的博客 452
上一篇: HBase最佳实践-内存规划
下一篇: HBase最佳实践 – 客户端重试机制
LuckyJiang.2021
博客等级 码龄15年 217粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值