基于物理文件的HBase备份还原

时间:2024-01-15 12:23:26

前提说明:

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复制文件时,把权限给搞丢了。

正常的权限信息如下:

基于物理文件的HBase备份还原

文件夹(对应的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、清理完毕后,即可进行还原操作。