Hbase表跨集群迁移手册
将旧集群的namespaceA下的表移到新集群的namespaceB下面
1、检查新、旧集群的hdfs、hbase是否正常
(1)使用命令:hbase hbck #查看hbasemeta表情况,确认0个,说明hdfs中的数据和hbase表中的meta表是对应的。
(2)使用hdfs dfsadmin –report
查看集群中的hdfs是否有block异常
查看无异常以后,继续前进。。。
2、将旧集群文件数据复制至新集群
(1)前面确认好两个集群都OK后,去旧集群的hdfs文件里get表文件下来,为防止影响hdfs中的数据,我们首先将数据复制到hdfs中的tmp目录,然后再get到本地。
命令为:
hadoop fs –cp /hbase/data/namespaceA/testTable /hbase/tmp
hadoop fs –get /hbase/tmp/ testTable /tmp/hbase_bak
(3)将旧集群的本地文件复制到新集群中,若可以通信,
(注意做操作的节点最好是大内存的,或者调大节点的jvm)
使用命令:scp -rp /tmp/hbase_bak/ testTable 新集群中的一个节点ip:/tmp/hbase_bak
3、将旧集群文件数据testTable加入新集群的hdfs的相同命名空间文件目录下。
因为是跨命名空间迁移hbase表,对应hdfs文件会携带源命名空间信息,所以不能直接跨命名空间导入新表,解决这个问题,可以采用下面的方式
(1)在新集群中新建一个和旧集群一样的命名空间namespaceA,再将旧集群的testTable文件,导入新集群的hdfs中,具体命令如下:
create_namespace 'namespaceA'
hadoop fs -put /tmp/hbase_bak /testTable /hbase/data/ namespaceA /testTable #添加数据到hdfs文件中
hbase hbck -repair ' namespaceA: testTable '
OK 修复成功!!!(hbase里的meta表和hdfs中的文件匹配一致)
为了验证是否成功
需要进入hbase里查看是否已经真的导入表了。
(2)同集群跨命名空间表复制
create_namespace 'namespaceB'
#在新集群新建namespaceB这个命名空间
create ‘namespaceB:testTable’
#在新集群新建namespaceB:testTable这个表,须与namespaceB中的testTable表结构一致。
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name="namespaceB:testTable" namespaceA:testTable
当map值达到100%后,会结束这个进程。
Hbase shell
进入hbase中查看是否已成功将testTable表导入namespaceB命名空间下。
list
scan 'namespaceA: testTable', {LIMIT => 2}
到这里,这张表就复制到新的集群里了,跨集群跨命名空间复制表已完成
4、生产环境,如果在新集群的namespaceA下的也存在同名的testTable表,那用上面的方法是行不通的。
可使用下面的方案,前提是有测试集群
用自己的测试集群解决跨命名空间的问题,
就是在测试集群里分别建namespaceA和namespaceB两个命名空间,将新集群的testTable表复制到测试环境的namespaceA里,再进行put和repair操作,步骤和上面的一样。
create_namespace 'namespaceA’
create_namespace 'namespaceB’
old集群namespaceA的testTable文件——à测试集群namespaceA——àput+repair
测试集群namespaceA的testTable表——à测试集群namespaceB
测试集群namespaceB的testTable文件——ànew集群namespaceB——àput+repair