HBCK2修復RIT實踐筆記

前言

本文記錄了作者使用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 assign
    
  3. assign各個表中offline的region
    檢查一下各個表中是否有region的StorefileSize爲0,當然也可能是本身沒有存儲多少數據,要注意辨別。這種一般對其assigns就可以了。
    在這裏插入圖片描述

    對於一些大表可能有上千個region的,一個個甄選未免太浪費時間,可以直接在web界面將其region區域全部拷貝下來,複製到txt,使用下述命令進行篩選

    cat regions.txt |grep -v 'GB' |grep -v 'MB' > region2.txt
    

    使用以下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 assign 就可以了

3. 注意事項

對procedure執行bypass後其狀態會由waiting轉換爲success(bypassed),但不會立即移除出rit隊列。可通過重啓master解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章