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.snapshot和archive,将这个两个文件夹拷贝到集群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.snapshothdfs dfs -chown -R hbase:hdfs /apps/hbase/data/archive
-
最后在集群B上进入hbase shell,通过命令
list_snapshots可以看到导入的快照,然后使用restore_snapshot 'snapshotName'还原数据;