技術實操丨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進行業務訪問了。

 

點擊關注,第一時間了解華為雲新鮮技術~