记一次HBase的STUCK Region-In-Transition问题

HBase STUCK Region-In-Transition问题

产生原因

HBase2.x的Procedure是记录了HBase的各种操作,比如创建表、删除表、禁用表。当他出现不一致的时候可能就会导致STUCK Region-In-Transition。

解决方案

HBase2.x已经有了相当先进的修复工具hbck2,但是这个修复工具试基于HbckService类来完成的,而HBase2.x并不是所有的版本都含有这个类,比如2.0.3之前和 2.1.1之前的版本。点击下载hbck2
使用方法 - 比如想让某个procedure 无论是否成功都当作执行成功为procedure的id
更多的用法请参考官网

 hbase  hbck -j  hbase-hbck2-1.0.0-SNAPSHOT.jar bypass -o <PID>

当你的HBase版本刚好是这些不支持Hbck2的版本的时候就更无奈,因为Hbck2的介绍说,HBase2.x和Hbase1.x版本变化是很大的,因此hbck1不能进行修复Hbase2.x,如果你这个做了,可能会导致一些未知的错误。

我的HBase版本为2.1.0,刚好不支持hbck2,我卡住的地方为删除一张表。因此我只需要从集群中删除一些数据就可以。我的步骤如下,如果你卡住的地方不是删除表请不要模仿。

  1. 删除该表对应的hdfs数据。
  2. 删除该表对应的hbase:meta中关于这个表的数据。
  3. 关闭Hbase集群,然后将hdfs中/hbase/MasterProcWALs数据移动另一个目录,注意不要把这个目录移走,仅仅移走目录下的内容。
  4. 启动集群。
    启动之后发现卡住的地方已经好了,但是要搞清楚为什么卡住,以后注意,防止下次被卡住的情况发生。

删除meta表的部分数据我使用的为代码,代码如下.注意我的表名为 cdr201908

package cdr;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.PrefixFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.Iterator;
import java.util.LinkedList;


public class Fix201908 {
    public static void main(String[] args) throws Exception {
        System.out.println("创建链接中...");
        Configuration configuration = HBaseConfiguration.create();
        Connection connection = ConnectionFactory.createConnection(configuration);

        Table table = connection.getTable(TableName.valueOf("hbase:meta"));
        PrefixFilter prefixFilter = new PrefixFilter(Bytes.toBytes("cdr201908"));
        Scan scan = new Scan();
        scan.setFilter(prefixFilter);
        ResultScanner scanner = table.getScanner(scan);
        LinkedList<Delete> deletes = new LinkedList<>();
        int count = 0;
        Iterator<Result> results = scanner.iterator();
        while(results.hasNext())
        {
            Result result = results.next();
            for(Cell kv: result.listCells())
            {
               String s1 = new String(kv.getRowArray(),kv.getRowOffset(),kv.getRowLength());
                byte[] key = new byte[kv.getRowLength()];
                System.arraycopy(kv.getRowArray(),kv.getRowOffset(),key,0,kv.getRowLength());
                if(Bytes.toString(key).startsWith("cdr201908")){
                    System.out.println("rowkey:" + new String(key));
                    Delete delete = new Delete(key);
                    deletes.add(delete);
                    count += 1;
                }
            }
        }
        table.delete(deletes);
        System.out.println("---------------------------------------------");
        System.out.println(count);
        System.out.println("---------------------------------------------");
        scanner.close();
        table.close();
        connection.close();
    }
}

你可能感兴趣的:(HBase,坑爹那回事)