基於物理文件的HBase備份還原


 

前提說明:

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、清理完畢后,即可進行還原操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM