前提說明:
1、HBase數據分表,所以備份的粒度是表。
2、備份的內容為Azure的Blob存儲。
HBase Blob備份
備份時,需要先將表disable,以保持數據一致性。
備份的工具可以用Azcopy,或者Azure Client等。各種工具另一篇單獨介紹。其它沒什么可說的。
備份完成后,相應的表可以drop或進行其它操作。
HBase Blob還原
HBase中之前不存在該表(或者之前刪除的很干凈)
這種場景下,還原比較容易。步驟如下。
1、將數據所在的Folder(以表名為文件夾名)復制到存儲賬號/容器/hbase/data/default目錄下。Folder對應的同名Blob文件(記錄權限等屬性)不需要復制。
2、在HBase中執行數據恢復的命令(TaskLog為表名):
hbase hbck -repair 'TaskLog' -ignorePreCheckPermission -fixMeta
3、scan 'TaskLog' 查看還原的結果。
遇到的問題及解決方案
通過Azcopy復制過來的文件可以恢復,但是通過AzureClient API復制過來的文件在進行恢復時報錯:
[main] util.HBaseFsck: Unable to read .tableinfo from wasb://hdptestjn@hdptestjn.blob.core.chinacloudapi.cn/hbase
org.apache.hadoop.hbase.TableInfoMissingException: No table descriptor file under wasb://hdptestjn@hdptestjn.blob.core.chinacloudapi.cn/hbase/data/default/CM_EvcRegisterBatteryInfo
at org.apache.hadoop.hbase.util.FSTableDescriptors.getTableDescriptorFromFs(FSTableDescriptors.java:513)
at org.apache.hadoop.hbase.util.FSTableDescriptors.getTableDescriptorFromFs(FSTableDescriptors.java:500)
at org.apache.hadoop.hbase.util.FSTableDescriptors.getTableDescriptorFromFs(FSTableDescriptors.java:480)
at org.apache.hadoop.hbase.util.HBaseFsck.loadHdfsRegionInfos(HBaseFsck.java:1182)
at org.apache.hadoop.hbase.util.HBaseFsck.onlineConsistencyRepair(HBaseFsck.java:660)
at org.apache.hadoop.hbase.util.HBaseFsck.onlineHbck(HBaseFsck.java:697)
at org.apache.hadoop.hbase.util.HBaseFsck.exec(HBaseFsck.java:4751)
at org.apache.hadoop.hbase.util.HBaseFsck$HBaseFsckTool.run(HBaseFsck.java:4552)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:90)
at org.apache.hadoop.hbase.util.HBaseFsck.main(HBaseFsck.java:4540)
報錯原因:通過AzureClient API復制文件時,把權限給搞丟了。
正常的權限信息如下:
文件夾(對應的blob)的屬性有兩個:hdi_isfolder=true,hdi_permission={"owner":"hdp","group":"supergroup","permissions":"rwxr-xr-x"}
文件的屬性有一個:hdi_permission={"owner":"hdp","group":"supergroup","permissions":"rw-r--r--"}
解決方案:通過AzureClient API復制文件時,添加以上權限信息。注意owner和group要修改成目標HBase所有Linux系統的實際用戶和組。
另外,通過Azcopy復制文件時,權限信息帶過來了,但owner和group仍舊是源文件的屬性。如果源和目標的用戶/組不一致時,會產生權限的問題,需要注意。
HBase中之前存在該表(或者之前刪除的不徹底)
HBase如果已經存在該表,或曾經存在過而元數據清理不徹底,則在恢復時可能會出錯。
所以,下面是清理元數據的方案。清理完畢后,再采用上面的方案進行恢復即可。
1、查看HDFS文件,是否存在相應的目錄,如果有,則刪除:
hdfs dfs -rmr /hbase/data/default/TaskLog
2、查看zookeeper中是否還有元數據 的殘留,如果有,則刪除:
1)進入zookeeper的bin目錄,如: /usr/hdp/2.5.0.0-1245/zookeeper/bin/
2)連接某一個zookeeper節點,如,執行:./zkCli.sh -server 10.0.0.13:2181
3)查看目錄(ls /hbase-unsecure/table)下是否存在表TaskLog,如果有,則刪除,即執行命令:
rmr /hbase-unsecure/table/TaskLog
3、重新修復HBase的表結構,執行命令:
hbase hbck -ignorePreCheckPermission -fixMeta
4、清理完畢后,即可進行還原操作。