摘要:分享一個HBase叢集恢復的方法。
背景
在HBase 1.x中,經常會遇到後設資料不一致的情況,這個時候使用HBCK的命令,可以快速修復後設資料,讓叢集恢復正常。
另外HBase資料遷移時,大家經常使用到一種遷移方式是:拷貝HBase的資料目錄/hbase/data/default到新的叢集,然後在新叢集執行HBCK的命令讓後設資料重建,這種拷貝資料目錄然後恢復後設資料的方式是一種快速直接的手段。
HBase升級到2.X版本之後,hbase hbck中的一些修復命令已經不再支援,包括,所以在HBase遇到叢集故障,無法通過HBCK快速把後設資料修復,通過HBase資料目錄遷移的方式也就使用不了。
在HBase 2.X的客戶端執行hbase hbck時,常用的fixMeta命令已經不再支援。
hbck-1無法使用
HBase 2.X版本加強了可靠性,因為使用了 procedure,由於之前的hbck(hbck-1)是會直接去向region server或者hdfs傳送請求進行修復,而在HBase 2.0版本上叢集內部操作全部都被挪到了procedure v2(下文都稱為procedure)上進行處理。
因為所有的命令都是經過master來協調處理,所以在修復時也需要通過master進行修復。否則反而可能導致更嚴重的不一致問題。所以hbck-1在HBase 2.x版本是不適用的。
HBase2.X版本中後設資料的恢復方法
1. 修改配置hbase.assignment.skip.empty.regions=false
如果是普通的hbase:meta系統表中的後設資料不正確,在修改完此引數重啟HBase後就已經能恢復
當第一步驟完成後還不能修復,就要使用下面的命令了
例如啟動後發現,hbase shell能list出資料,但是表無法put或者scan,這時候hbase:meta表裡的t1表記錄其實是不正確的
2. hbase org.apache.hadoop.hbase.util.hbck.OfflineMetaRepair -fix
這個命令需要停止HBase然後執行。
當表的資料目錄存在(/hbase/data/default/<table>),而在hbase:meta表中後設資料不正確時,需要HBase停止後,執行這個meta表修復命令,
執行完成後,啟動HBase。
啟動完成後,檢視hbase:meta表的使用者表記錄,可以看到t1表的後設資料都生成了。
3. 此時使用者表就恢復了,如果還存在region空洞fixHdfsHoles或者fixHdfsOverlaps問題,可以使用hbck1中的["-fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixReferenceFiles"]
在華為雲EI核心團隊的hbase2中,已經將這4個命令重新整合進hbck-1中,便於維護。
新叢集清理及資料遷移
看完上面的後設資料恢復,應該就知道接下來的這種HBase資料遷移方式的原理:通過拷貝資料目錄,讓HBase後設資料與業務資料目錄重新建立關係,達到業務正常讀寫。
下面例子只考慮使用者使用default名稱空間
1. 拷貝舊叢集的HBase資料目錄到新叢集,將舊叢集的/hbase/data/default目錄拷貝到了hdfs上的/mydata/目錄;
2. 如果新叢集資料不需要清理,則跳過此步驟
停止HBase
清除HBase在資料儲存目錄,hdfs dfs -rm -r /hbase
清除HBase在zk的節點,使用ZK客戶端工具zkCli.sh –server <ZK NODE>:2181 進入後執行deleteall /hbase
啟動HBase,讓目錄結構自動生成
3. 保持HBase叢集停止狀態,拷貝舊機器資料目錄到新叢集HBase的資料目錄中;
hdfs dfs -cp /mydata/default/* /hbase/data/default/
4. 執行hbase修復命令hbase org.apache.hadoop.hbase.util.hbck.OfflineMetaRepair –fix
5. 設定hbase.assignment.skip.empty.regions=false並啟動HBase
執行完上述步驟,在新的叢集就能對遷移過來的HBase進行業務訪問了。