专栏首页大数据平台TBDSWAL文件过多导致hbase master无法启动
原创

WAL文件过多导致hbase master无法启动

导语:

近期腾讯云某家大客户的hbase master一直无法启动,经过仔细诊断之后发现是由于hbase的WAL文件非常多(达到15TB),导致hbase在zk的节点(存储WAL文件信息的节点)超过4096*1024 默认大小,无法正常提供服务。因此,hbase master无法正常启动。通过增加zk节点的大小参数,并且优化WAL文件,最终解决该问题。

一、故障现象

hbase master启动不了,日志报错无法连接上zk 的 /hbase/splitWAL节点:

图1: hbase master 报错日志

既然是报错连接不上zk的节点 /hbase-unsecure/splitWAL(这个节点存储的是hbase的WAL文件信息),那么我们登录上zk去测试该节点:

图2: zk的报错信息

从zk的报错信息可以看到, /hbase-unsecure/splitWAL 节点的大小“ Packet len10980003 is out of range”,也就是节点大小超出范围。

二、故障分析与解决

从上述报错来看,导致hbase master无法启动的原因是hbase在zk的节点(存储WAL文件信息的节点)超过

一定值,导致hbase master无法连接到zk节点,进而无法启动。按理说,hbase存储WAL不会太多,zk节点也不会超过4M大小。我们先查看hbase 的 WAL文件大小:

图3: hbase 的 WAL文件大小

hbase 的 WAL文件大小超过15TB,看来确实是异常

我们进一步诊断查看zk的源代码:

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);

发现zk的单节点大小不能超过 4096*1024,10980003 已经超过该阈值。

经过上诉分析,基本上可以判断是由于hbase 的WAL文件太多,导致zk节点 /hbase-unsecure/splitWAL 接近10M,超过4M的阈值限制,导致hbase master无法连接到 zk节点 /hbase-unsecure/splitWAL,进而无法启动hbase master。

三、故障解决办法

最简单的解决办法,就是修改hbase连接zk的节点参数大小,使得其超过10M,这样可以将hbase master启动;然后再处理WAL过大问题,一般而言,15TB的WAL文件意味着hbase 的WAL机制已经异常,需要手工处理。

通过修改hbase-env.sh 文件,将参数 -Djute.maxbuffer = 20971520 (20M) 设置到 HBASE_OPTS。具体设置方法根据大数据平台不同而有差异。比如,如果是ambari搭建的大数据集群,那么直接在ambari界面修改hbase的配置文件,在hbase-env.sh文件最后添加以下一行参数:

export HBASE_OPTS = "$HBASE_OPTS -Djute.maxbuffer = 20971520"

如果是自己手工搭建的,直接在修改hbase-env.sh 文件,将上述一行参数添加到hbase-env.sh 文件末尾。

最后重启hbase,即可生效。

四、后续进一步优化

进一步的还需要找到hbase 为什么有如此多WAL文件的原因,找出根源才能彻底解决这个问题。首先需要手工处理这15TB的WAL文件,然后再找出hbase 产生如此多WAL文件的根本原因,进行彻底解决。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • docker学习笔记(命令)

    Java架构师历程
  • 第1章 必须掌握的Linux命令

     命令对象一般是指要处理的文件、目录、用户等资源,而命令参数可以用长格式(完整的选项名称),也可以用短格式(单个字母的缩写),两者分别用--与-作为前缀(示例请...

    mathor
  • 如何在Ubuntu 14.04上使用Corosync,Pacemaker和浮动IP创建高可用性HAProxy设置

    本教程将向您展示如何在Ubuntu 14.04上创建高可用性HAProxy负载均衡器设置,并支持浮动IP和Corosync / Pacemaker集群堆栈。HA...

    何处惹尘埃
  • 这些Python代码技巧,你肯定还不知道

    人们还经常把 Python 笑称为「可执行伪码(executable pseudocode)」。但是,当你可以编写这样的代码时,很难去反驳这种言论:

    机器之心
  • git以及github的使用(1)

    http://my.oschina.net/bxxfighting/blog/378196

    bear_fish
  • 快速学习Bash

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载。

    Vamei
  • bash/shell编程学习(2)

    注:linux中有一个经典名言【一切皆文件】,/dev/null可以认为是一个特殊的空文件,更形象点,可以理解为科幻片中的黑洞,任何信息重向定输出到它后,便有去...

    菩提树下的杨过
  • 快速学习Bash

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载。

    Vamei
  • docker部署redis,清空redis缓存

    用户2235302
  • 安全运维之如何找到隐匿于last和w命令中的ssh登录痕迹

    *本文原创作者:ForrestX386,本文属FreeBuf原创奖励计划,未经许可禁止转载

    FB客服

扫码关注云+社区

领取腾讯云代金券