HBasee数据跨集群迁移记录

318 阅读2分钟
HBasee数据跨集群迁移记录
集群信息
  • 集群A未配置kerberos安全认证
  • 集群B配置可kerberos安全认证
  • 需要把集群A中186个HBase表迁移到集群B中,集群A中的表分布在default和hudi两个命名空间下
迁移方案

使用HBase快照技术迁移数据

迁移步骤
  • 在集群A中给某个表打快照:snapshot 'tableName' , 'snapshotName'

  • 在集群B中使用hbase用户导入集群A的快照信息:

       hbase org.apache.hadoo.hbase.snapshot.ExportSnapshot \
       -Dipc.client.fallback-to-simple-auth-allowed=true \
       -snapshot snapshotName \
       -copy-from hdfs://clusterA_ip:port/apps/hbase/data \
       -copy-to hdfs://clusterB_ip:port/apps/hbase/data
    
  • 在集群B中进入hbase shell,使用list_snapshots查看是否有导入的快照,如果有则证明快照已经导入,然后使用clone_snapshot 'snapshotName','tableName'或者clone_snapshot 'snapshotName','namespace:tableName'将快照克隆成新表,

遇到的问题

执行第二步在集群B中使用hbase用户导入集群A的快照信息时报错,日志显示拷贝集群A的文件到集群B是找不到文件块BP信息。到集群A中使用hdfs dfsadmin -report命令查看hdfs文件系统状态,发现under replicated blocks不为0,说明hdfs中有块没有复制;

  • 首先找出来没有复制的block信息

hdfs fsck / | grep 'Under replicated' | awk -F':' '{print $1}' >> /tmp/under_replicated_files

  • 然后进行修复

    hadoop fs -setrep 3 fileName

查出来未复制的block,副本数设置的是10,但是集群节点一共是6个。不知道客户是出于什么目的设置的副本数是10,所以我这里没有进行修复。采用了第二个迁移方案,依然是使用HBase快照技术迁移数据;

迁移步骤
  • 依然是先在集群A中给某个表打快照:snapshot 'tableName' , 'snapshotName'

  • 在集群A中使用hbase用户将快照文件导出到hdfs上指定目录中 ,该目录hbase要有rwx权限,命令如下:

     hbase org.apache.hadoo.hbase.snapshot.ExportSnapshot \
     -Dipc.client.fallback-to-simple-auth-allowed=true \
     -snapshot snapshotName \
     -copy-to hdfs://clusterA_ip:port/tmp/qianyi
    
  • 导出成功后在hdfs的/tmp/qianyi目录下会有两个文件夹.hbase.snapshotarchive,将这个两个文件夹拷贝到集群B的hbase数据目录下,拷贝命令:hadoop distcp -Dipc.client.fallback-to-simple-auth-allowed=true hdfs://clusterA_ip:port/tmp/qianyi hdfs://clusterB_ip:port/apps/hbase/data

  • 在集群B上修改文件夹权限

    • hdfs dfs -chown -R hbase:hdfs /apps/hbase/data/.hbase.snapshot
    • hdfs dfs -chown -R hbase:hdfs /apps/hbase/data/archive
  • 最后在集群B上进入hbase shell,通过命令list_snapshots可以看到导入的快照,然后使用restore_snapshot 'snapshotName'还原数据;