技術實操丨HBase 2.X版本的元數據修復及一種數據遷移方式
摘要:分享一個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進行業務訪問了。