zoukankan      html  css  js  c++  java
  • 基于物理文件的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、清理完毕后,即可进行还原操作。

  • 相关阅读:
    骑行封龙山
    静夜
    骑行伏羲台
    我?
    生活挺好
    多事之秋,大家注意安全
    看不到啊看不到
    个人时间管理
    给DataGrid设置中文列名
    食用油是那么让人又爱又恨!
  • 原文地址:https://www.cnblogs.com/xianhan/p/7474799.html
Copyright © 2011-2022 走看看