HBCK2修复RIT实践笔记

本文详述了使用HBCK2工具处理线上HBase出现的RIT(Region In Transition)状态的实践经验,包括下载HBCK2、使用命令、查找问题、实践示例及注意事项。建议通过编译获取最新版本的HBCK2,并按照指南进行故障排查和解决。
摘要由CSDN通过智能技术生成

前言

本文记录了作者使用HBCK2工具对线上HBase发生RIT状态的处理,仅供参考,若有疵漏,还望指正。

网络上关于HBCK2的文章很少,基本都是复制粘贴自田竞云(小米)的这一篇:HBase指南 | HBase 2.0之修复工具HBCK2运维指南

事实上这一篇文章介绍得也已经很详细了。这里只是做一些实践上的补充说明。

1. 下载

直接去hbase的官网下载地址里就可以找到。这里直接给最新版本的下载链接(截止至2020年4月):https://downloads.apache.org/hbase/hbase-operator-tools-1.0.0/hbase-operator-tools-1.0.0-bin.tar.gz
但还是推荐自己去git clone编译,因为官网提供的编译版本有滞后性。通常来说,使用最新版本的hbase再搭配使用最新编译的HBCK2,可以解决绝大部分莫名其妙的问题。(fixMeta+restart暴力流)
新版本的HBCK2有更多更方便的功能,不过一般只能在新版本的hbase中使用。

2. 使用命令

将其解压后得到 hbase-hbck2-1.0.0.jar,再cp到$HBASE_HOME/lib下,执行 hbase org.apache.hbase.HBCK2 <命令> 即可,第一次使用推荐 hbase org.apache.hbase.HBCK2 -h 查看详细介绍

使用方法

1. 查找问题

参考HBCK2运维指南的思路:

canary tool
Procedures & Locks 页面状态
RIT队列
Master日志

2. 实践例子

  1. 处理Procedures & Locks
    在 Procedures & Locks 页面查找waiting状态的procedure,按顺序进行bypass。按顺序是因为有一些waiting的发生是procedure存在依赖关系,将其bypass后后面的procedure会进入success状态。如果bypass返回false就使用bypass -r,还是不行再使用bypass -or

  2. 处理RIT队列
    参考HBCK2运维指南可以以txt格式拿到RIT队列的所有procedure的id,将其复制到任意文件(如pid.txt),再执行以下命令即可

    cat pid.txt | xargs hbase org.apache.hbase.HBCK2 bypass -or 
    

    然后再以txt格式拿到RIT队列的所有region的encodedName,将其复制到任意文件(如region.txt),再执行以下命令即可

    cat region.txt | xargs hbase org.apache.hbase.HBCK2 assigns
    
  3. assign各个表中offline的region
    检查一下各个表中是否有region的StorefileSize为0,当然也可能是本身没有存储多少数据,要注意辨别。这种一般对其assigns就可以了。
    在这里插入图片描述

    对于一些大表可能有上千个region的,一个个甄选未免太浪费时间,可以直接在web界面将其region区域全部拷贝下来,复制到txt,使用下述命令进行筛选

    cat regions.txt |grep -v 'GB' |grep -v 'MB' > region2.txt
    
  4. 高版本的hbase有hbck记录页,去页面查看,根据提醒操作就行,更方便
    在这里插入图片描述

    使用以下Java代码即可提取出encodedName

    @Test
    public void printRegionEncodedName() throws IOException {
        List<String> lines = FileUtil.readUtf8Lines("C:\\tmp\\region2.txt");
        List<String> regionEncodedNameList= Lists.newArrayListWithExpectedSize(lines.size());
        for (String line : lines) {
            if(StringUtils.isBlank(line)){
                continue;
            }
            int point1=line.indexOf(".") ;
            int point2=line.indexOf(".", line.indexOf(".")+1);
            String s = line.substring(point1+1, point2);
            System.out.println(s);
            regionEncodedNameList.add(s);
        }
        System.out.println("size:"+regionEncodedNameList.size());
        try (PrintWriter pw = new PrintWriter(new FileWriter("C:\\tmp\\encodedName.txt"));){
            regionEncodedNameList.forEach(regionEncodedName->pw.println(regionEncodedName+" "));
        }
    }
    

    然后又是 cat encodedName.txt | xargs hbase org.apache.hbase.HBCK2 assigns 就可以了
    如下,一次性对大量region进行操作
    在这里插入图片描述

3. 注意事项

对procedure执行bypass后其状态会由waiting转换为success(bypassed),但不会立即移除出rit队列。可通过重启master解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值