前言:《读者来信》是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-transition
	at 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中。因此,我们必须进行遍历才能获得完整列表。

参考文献

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

读者来信-5 | 如果你家HBase集群Region太多请点进来看看,这个问题你可能会遇到的更多相关文章

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

    前言:<读者来信>是HBase老店开设的一个问答专栏,旨在能为更多的小伙伴解决工作中常遇到的HBase相关的问题.老店会尽力帮大家解决这些问题或帮你发出求救贴,老店希望这会是一个互帮互助的 ...

  2. hbase集群region数量和大小的影响

    1.Region数量的影响 通常较少的region数量可使群集运行的更加平稳,官方指出每个RegionServer大约100个regions的时候效果最好,理由如下: 1)Hbase的一个特性MSLA ...

  3. 读者来信 | 刚搭完HBase集群,Phoenix一启动,HBase就全崩了,是什么原因?(已解决)

    前言:之前有朋友加好友与我探讨一些问题,我觉得这些问题倒挺有价值的:于是就想在本公众号开设一个问答专栏,方便技术交流与分享,专栏名就定为:<读者来信>.如遇到本人能力有限难以解决的问题,我 ...

  4. hbase集群安装与部署

    1.相关环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 hbase1.2.4 本篇文章仅涉及hbase集群的搭建,关于hadoop与zookeeper的相关部 ...

  5. hbase集群的启动,注意几个问题

    1.hbase的改的会影响器他的组件的使用, 故而, 在修改 hadoop的任何组件后, 一定要记得其它的组件也能受到影响, 一下是我在将hadoop的集群改了之后 , 再次运行hbase的时候, 就 ...

  6. Hbase集群搭建及所有配置调优参数整理及API代码运行

    最近为了方便开发,在自己的虚拟机上搭建了三节点的Hadoop集群与Hbase集群,hadoop集群的搭建与zookeeper集群这里就不再详细说明,原来的笔记中记录过.这里将hbase配置参数进行相应 ...

  7. HBase集群搭建

    HBase集群搭建 搭建环境:假设我们的linux环境已经准备好,包括网络.JDK.防火墙.主机名.免密登录等都没有问题,而且一定要有zookeeper.下面我们用3台linux虚拟机来搭建Hbase ...

  8. hadoop(四): 本地 hbase 集群配置 Azure Blob Storage

    基于 HDP2.4安装(五):集群及组件安装 创建的hadoop集群,修改默认配置,将hbase 存储配置为 Azure Blob Storage 目录: 简述 配置 验证 FAQ 简述: hadoo ...

  9. 基于HDInsight 3.4 HBase集群规划参考

    基于linux 创建HDInsight HBase集群,选择最小配置,zk(3).NN(2).WN(2),集群节点默认组件服务规划如下 NN0: Active NameNode /HDFS ZKFai ...

随机推荐

  1. Safari配置WebApp----添加启动图和桌面图标让你的WebApp在ios设备上体验如原生一样

    现在很多开发者的Web应用程序的设计样式和交互类似本机应用程序,例如,它的缩放比例适合iOS上的整个屏幕.当用户将其添加到主屏幕时,您可以通过使其看起来像本机应用程序一样,在iOS上为您的Web应用程 ...

  2. 读《Java并发编程的艺术》学习笔记(一)

    接下来一个系列,是关于<Java并发编程的艺术>这本书的读书笔记以及相关知识点,主要是为了方便日后多次复习和防止忘记.废话不多说,直接步入主题: 第1章  并发编程的挑战 并发编程的目的是 ...

  3. mysql的锁与事务

    1. MySQL中的事物 1.InnoDB事务原理 1. 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态. 2. 在数据库提交 ...

  4. 阿里云Tomcat配置

    阿里云Tomcat配置并开放 本文可对以下问题提供参考 服务器 如何配置 Tomcat 配置 端口在监听,但是外网无法访问怎么办 注意事项: 对于阿里云服务器相对较为特殊,因为阿里云服务器除了需要在系 ...

  5. python第一次作业

    import turtle turtle.pensize(2) turtle.pencolor("black") turtle.fillcolor("red") ...

  6. vue2.0:项目开始,首页入门(main.js,App.vue,importfrom)

    对main.js App.vue 等进行操作: 但是这就出现了一个问题:什么是main.js,他主要干什么用的?App.vue又是干什么用的?main.js 里面的import from又在干嘛?ne ...

  7. 使用GUI工具Portainer.io管控Docker容器

    背景 5年前容器技术扑面而来,如今已经成为面向云原生开发的基础架构,基于微服务的设计需要部署大量容器,同时强调了友好快速的管理容器. 是时候推荐一个轮子Portainer.io:提供GUI界面的容器管 ...

  8. java-字节流练习(新手)

    参考手册: 关键字: FileInputStream() Input是从硬盘到内存 FileOutputStream() 而output是从内存到硬盘,所以实现了复制粘贴. read() 调用方法读取 ...

  9. Redis(十二):redis请求转发的实现

    请求转发一般的原因为: 1. 该请求自身无法处理,需要转发给对应的服务器处理: 2. 为实现负载均衡,使用路由服务,选择目标实例进行转发: 在集群模式下,请求可以打到任何一台redis服务器上.然而并 ...

  10. 高性能-GC

    带着问题去思考!大家好 相对.NET 来说.CLR去处理了,C,C++这些就需要手动去垃圾回收. GC大部分容易察觉的性能问题.其实很多问题实际是哪个都是由于对垃圾回收器的行为和预期结果理解有误.在, ...