HBase客户端访问超时原因及参数优化_Fang的博客-CSDN博客

标签: | 发表时间:2021-07-02 09:04 | 作者:
出处:https://blog.csdn.net

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

hbase.rpc.timeout

以毫秒计算的所有HBase RPC超时,默认为60s。
该参数表示一次RPC请求的超时时间。如果某次RPC时间超过该值,客户端就会主动关闭socket。
如果经常出现java.io.IOException: Connection reset by peer异常问题,估计HBase集群出现了大量高并发读写业务或者服务器端发生了比较严重的Full GC等问题,导致某些请求无法得到及时处理,超过了设置的时间间隔。
根据实际情况,可以修改为5000,即5s。

hbase.client.retries.number

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

hbase.client.pause

通用客户端暂停时间值(重试的休眠时间)。重试get失败或区域查找等操作前,经常使用的等待时间段。
HBase1.1版本开始此值默认为100ms,比较合理,如果你的版本不是,建议修改此值为100ms。

zookeeper.recovery.retry

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

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

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

zookeeper.recovery.retry.intervalmill

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

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。

hbase.regionserver.lease.period

hbase.client.operation.timeout参数规定的超时基本涉及到了HBase所有的数据操作,唯独没有scan操作。然而scan操作却是最有可能发生超时的,也是用户最为关心的。HBase特别考虑到了这点,并提供了一个单独的超时参数进行设置:hbase.client.scanner.timeout.period。
此参数指scan查询时每次与RegionServer交互的超时时间。
默认为60s,可不调整。HBase 1.1版本开始,此参数更名为hbase.client.scanner.timeout.period。
为了对这个参数更好地理解,我们演示一个scan的例子:

 package com.zy.hbase;
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; public class KylinScan { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { scan("kylin"); } @SuppressWarnings("deprecation") public static void scan(String tbl) throws IOException { Configurationconf = HBaseConfiguration.create(); conf.set("HADOOP_HOME","D:\\iangshouzhuang\\hadoop-2.6.0"); conf.set("hbase.zookeeper.quorum","10.20.18.24,10.20.18.25,10.20.18.28"); conf.set("hbase.zookeeper.property.clientPort","2181"); conf.set("zookeeper.znode.parent","/hbase114"); conf.setInt("hbase.rpc.timeout",20000); conf.setInt("hbase.client.operation.timeout",30000); conf.setInt("hbase.client.scanner.timeout.period",20000); StringtableName = tbl; TableNametableNameObj = TableName.valueOf(tableName); Connectionconnection = ConnectionFactory.createConnection(conf); HTabletable = (HTable) connection.getTable(tableNameObj); Scanscan = new Scan(); scan.setMaxResultSize(10000); scan.setCaching(500); ResultScannerrs = 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())); } } } }

输出结果为:

      row:100001, family:info, qualifier:id,qualifiervalue:1, timestamp:1469930920802.

row:100001, family:info, qualifier:name,qualifiervalue:Hadoop, timestamp:1469930934184.

很多人都会误认为一次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操作可能会被拆分为几个RPC
    一次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 客户端 访问] 推荐:

HBase客户端访问超时原因及参数优化_Fang的博客-CSDN博客

- -
默认的HBase客户端的参数配置是没有做过优化的,所以对于低延时响应的HBase集群,需要对客户端的参数进行优化. 以毫秒计算的所有HBase RPC超时,默认为60s. 该参数表示一次RPC请求的超时时间. 如果某次RPC时间超过该值,客户端就会主动关闭socket. 如果经常出现java.io.IOException: Connection reset by peer异常问题,估计HBase集群出现了大量高并发读写业务或者服务器端发生了比较严重的Full GC等问题,导致某些请求无法得到及时处理,超过了设置的时间间隔.

HBase入门 客户端操作

- - 学着站在巨人的肩膀上
HBase入门HBase入门. 部分内容参考于http://www.nabble.com/Re%3A-Map-Reduce-over-HBase---sample-code-p18253120.html. 对于HBase使用的类似与BigTable的技术我们这里就不仔细描述,可以参考google的论文以及网上的一些相关资料.另外,HBase的配置在HBase的官方文档中有很详细的描述.可以参见相关文档.

HBase 之访问控制

- gengmao - Trend Micro CDC SPN Team
构建和运维HBase集群是一个非常有挑战性的工作. HBase凭借其在海量数据的良好的扩展性和高效的读写能力,受到越来越多公司的重视. 在公司里,HBase越来越受欢迎. 希望通过HBase读写数据的产品越来越多,在兴奋之余,头疼的问题也来了. 毕竟,作为线上的产品,我们不希望过多人随意的访问,会照成很多潜在的风险,比如误删,误操作.

Windows7+Eclipse环境下Hbase Java客户端的开发

- - zzm
Centos 下Hbase0.98.10-hadoop2 集群的配置. 在Eclipse中创建Maven的工程. 将集群的hbase-site.xml文件放到工程的classes目录下. C:\windows\system32\drivers\etc文件,将Hbase集群的IP以及域名配置到该文件中.

HBase如何合理设置客户端Write Buffer - 大圆那些事 - 博客园

- -
大圆那些事| 转载请以超链接形式标明文章原始出处和作者信息. HBase客户端API提供了Write Buffer的方式,即批量提交一批Put对象到HBase服务端. 本文将结合HBase相关源码,对其进行深入介绍,分析如何在实际项目中合理设置和使用它. 什么时候需要Write Buffer. 默认情况下,一次Put操作即要与Region Server执行一次RPC操作,其执行过程可以被拆分为以下三个部分:.

通过客户端软件访问Gmail的方法

- - 月光博客
  Gmail对于很多中国用户来说是很难舍弃的服务,现在虽然Gmail所有客户端通讯协议(IMAP、POP3、SMTP等)端口 均被屏蔽,导致用户无法正常访问Gmail邮箱,不过,通过一些设置,我们依旧可以通过客户端软件来访问Gmail服务.   首先,需要在Gmail里设置其支持IMAP,这样才能在客户端里使用IMAP来访问Gmail.

hbase client访问的超时时间、重试次数、重试间隔时间的配置

- - 数据库 - ITeye博客
   超时时间、重试次数、重试时间间隔的配置也比较重要,因为默认的配置的值都较大,如果出现hbase集群或者RegionServer以及ZK关掉,则对应用程序是灾难性的,超时和重新等会迅速占满web容器的链接,导致web容器停止服务,关于socket的超时时间,有两种:1:建立连接的超时时间;2:读数据的超时时间.

hbase介绍

- AreYouOK? - 淘宝数据平台与产品部官方博客 tbdata.org
hbase是bigtable的开源山寨版本. 是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统. 它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作). 主要用来存储非结构化和半结构化的松散数据.

Riak对比HBase

- - NoSQLFan
文章来自 Riak官方wiki,是一篇Riak与HBase的对比文章. Riak官方的对比通常都做得很中肯,并不刻意偏向自家产品. 对比的Riak版本是1.1.x,HBase是0.94.x. Riak 与 HBase 都是基于 Apache 2.0 licensed 发布. Riak 的实现是基于 Amazon 的 Dynamo 论文,HBase 是基于 Google 的 BigTable.

[转]HBase简介

- - 小鸥的博客
   Hbase是一个分布式开源数据库,基于Hadoop分布式文件系统,模仿并提供了基于Google文件系统的Bigtable数据库的所有功能. 其目标是处理非常庞大的表,可以用普通的计算机处理超过10亿行数据,并且有数百万列元素组成的数据表. Hbase可以直接使用本地文件系统或者Hadoop作为数据存储方式,不过为了提高数据可靠性和系统的健壮性,发挥Hbase处理大数据量等功能,需要使用Hadoop作为文件系统.