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、清理完毕后,即可进行还原操作。

  • 相关阅读:
    IIS的各种身份验证详细测试
    HTTP Error 401.3 Unauthorized Error While creating IIS 7.0 web site on Windows 7
    C/S and B/S
    WCF ContractFilter mismatch at the EndpointDispatcher exception
    Configure WCF
    Inheritance VS Composition
    Unhandled Error in Silverlight Application, code 2103 when changing the namespace
    Java RMI VS TCP Socket
    Principles Of Object Oriented Design
    Socket处理发送和接收数据包,一个小实例:
  • 原文地址:https://www.cnblogs.com/xianhan/p/7474799.html
Copyright © 2011-2022 走看看