读者来信 | 如果你家HBase集群Region太多请点进来看看,这个问题你可能会遇到

本文主要是介绍读者来信 | 如果你家HBase集群Region太多请点进来看看,这个问题你可能会遇到,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:《读者来信》是HBase老店开设的一个问答专栏,旨在能为更多的小伙伴解决工作中常遇到的HBase相关的问题。老店会尽力帮大家解决这些问题或帮你发出求救贴,老店希望这会是一个互帮互助的小平台。有问题请直接在老店后台留言,有好的解决方案也请不要吝啬,诚挚欢迎大家能在留言区积极探讨解决方案,大胆发表自己的看法,也许你今天帮别人解决的问题,就是你明天可能遇到的答案。

来信人:刘*刚

小猿提问

在重启HBase集群的过程中,RS节点全部启动成功了,但是HMaser一直启动不起来,错误日志如下:

unexpected error, closing socket connection and attempting reconnect
java.io.IOException: Packet len4745468 is out of range!at org.apache.zookeeper.ClientCnxnSocket.readLength(ClientCnxnSocket.java:112)at org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:79)at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:366)at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081)
2020-04-02 22:31:08,673 ERROR [hadoop01:16000.activeMasterManager] zookeeper.RecoverableZooKeeper: ZooKeeper getChildren failed after 4 attempts
2020-04-02 22:31:08,674 FATAL [hadoop01:16000.activeMasterManager] master.HMaster: Failed to become active master
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/region-in-transitionat org.apache.zookeeper.KeeperException.create(KeeperException.java:99)at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1472)at org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper.getChildren(RecoverableZooKeeper.java:295)at org.apache.hadoop.hbase.zookeeper.ZKUtil.listChildrenNoWatch(ZKUtil.java:513)at org.apache.hadoop.hbase.master.AssignmentManager.processDeadServersAndRegionsInTransition(AssignmentManager.java:519)at org.apache.hadoop.hbase.master.AssignmentManager.joinCluster(AssignmentManager.java:494)at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:748)at org.apache.hadoop.hbase.master.HMaster.access$500(HMaster.java:184)at org.apache.hadoop.hbase.master.HMaster$1.run(HMaster.java:1729)at java.lang.Thread.run(Thread.java:748)

小猿分析

  • HBase 版本:Apache 1.2.1
  • 集群规模:120000+ region

    看错误日志,好像只看到了ZK的身影,日志关键词是[ZooKeeper.getChildren|Packet|out of range|ConnectionLoss for /hbase/region-in-transition]。 我们知道,HBase Master 重启时要做很多初始化工作,要与ZK数据节点进行一些交互工作,如元数据或节点状态的注册、修改、获取等等。看这些关键词大概好像明白是怎么回事:ZooKeeper在getChildren(region-in-transition)的时候超出了Packet的range,导致连接丢失了,Failed to become active master。

那什么是Packet呢?小猿问了问度娘,度娘回答说:

在 ZooKeeper 中,Packet 是一个最小的通信协议单元,即数据包。Pakcet 用于进行客户端与服务端之间的网络传输,任何需要传输的对象都需要包装成一个 Packet 对象。

那就是读取zk节点数据包长度有限制咯,这个时候我们肯定是先去网上找下zk有没有相关的参数可以调一下。结果还真的有:jute.maxbuffer,感觉自己很幸运。套用官网的话解释一下这个参数:

(Java system property: jute.maxbuffer) This option can only be set as a Java system property. There is no zookeeper prefix on it. It specifies the maximum size of the data that can be stored in a znode. The default is 0xfffff, or just under 1M. If this option is changed, the system property must be set on all servers and clients otherwise problems will arise. This is really a sanity check. ZooKeeper is designed to store data on the order of kilobytes in size.

翻译一下:

(Java系统属性:jute.maxbuffer) 此选项只能设置为Java系统属性。上面没有Zookeeper前缀。它指定可以存储在znode中的数据的最大大小。默认值为0xfffff,或不到1M。如果更改此选项,则必须在所有服务器和客户端上设置系统属性,否则会出现问题。这确实是一个健全性检查。ZooKeeper旨在存储大小为千字节的数据。

也有另一种说法:

需要注意的是,该参数并不是在 Server 和 Client 端同时设置才会生效。实际情况是,在客户端设置后,Zookeeper 将控制从 Server 端读取数据的大小(outgoingBuffer);而在服务端设置后,则是控制从 Client 端写入数据的大小(incomingBuffer)

相关代码如下:

protected final ByteBuffer lenBuffer = ByteBuffer.allocateDirect(4);
protected ByteBuffer incomingBuffer = lenBuffer;protected void readLength() throws IOException {int len = incomingBuffer.getInt();if (len < 0 || len >= ClientCnxn.packetLen) {throw new IOException("Packet len" + len + " is out of range!");}incomingBuffer = ByteBuffer.allocate(len);
}public static final int packetLen = Integer.getInteger("jute.maxbuffer", 4096 * 1024);

那为什么会读取这么大一个包呢?基于上文提到的关键字/hbase/region-in-transition(待分配region信息) 及Region的规模(120000+),我们猜测是因为Region太多了,导致/hbase/region-in-transition节点太大,HMaster读取该节点数据时超出限制并以失败告终。我们也在HBase Jira库找到了相关issue: Cluster with too many regions cannot withstand some master failover scenarios https://issues.apache.org/jira/browse/HBASE-4246

我们很多时候都不是第一个湿鞋的人,也许你今天帮别人解决的问题,就是你明天可能遇到的答案。这也是老店开设问答专栏《读者来信》的初心--为了知识更好的传播与分享!

小猿解答

当然也不只/region-in-transition节点会有这样的问题,/unssigned 等节点也可能会有一样的问题。解决方案总结如下: 方案一:清理zk节点历史上存在的垃圾数据

该方案旨在将zk节点的数据大小降下来,是否可以降到红线以下。

方案二:调大参数jute.maxbuffer

# 设置 Client 端
$ vim $ZOOKEEPER_HOME/bin/zkCli.sh# 增加 -Djute.maxbuffer=<buffer_size> 参数"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"  "-Djute.maxbuffer=1073741824"  \-cp "$CLASSPATH" $CLIENT_JVMFLAGS $JVMFLAGS \org.apache.zookeeper.ZooKeeperMain "$@"# 设置 Server 端
$ vim $ZOOKEEPER_HOME/conf/zoo.cfg# 增加 jute.maxbuffer=<buffer_size> 参数jute.maxbuffer=1073741824

调大该参数可能有风险,上面也提到zk旨在存储大小为千字节的数据。

方案三:使用层次结构(来自社区评论区)

该方案是通过区域ID的前缀将·/hbase/region-in-transition 目录分片。例如,区域1234567890abcdef将位于/hbase/region-in-transition/1234/1234567890abcdef中。因此,我们必须进行遍历才能获得完整列表。

参考文献

  • https://issues.apache.org/jira/browse/HBASE-4246
  • https://cloud.tencent.com/developer/article/1516691
  • https://yuzhouwan.com/posts/31915/

扫描二维码关注博主公众号

转载请注明出处!欢迎关注本人微信公众号【HBase工作笔记】

这篇关于读者来信 | 如果你家HBase集群Region太多请点进来看看,这个问题你可能会遇到的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697448

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给