由于公司前期没法及时提供生成环境的服务器,导致现有的业务开发在现有的服务器进行,HBase相关的数据在后期需要迁移到新的环境里。HBase数据迁移方式有以下几种:
CopyTable方式☞
hbase org.apache.hadoop.hbase.mapreduce.CopyTable [--starttime=X] [--endtime=Y] [--new.name=NEW] [--peer.adr=ADR] tablename
操作:
- starttime 执行时间范围的开始时间,未指定endtime则为读取starttime之后的所有数据
- endtime 执行时间范围的结束时间,未指定starttime则为第一条数据入库的时间到endtime之间的所有数据
- new.name 用于copytable时指定你要拷贝后的新表名称
- peer.adr 指定集群zookeeper地址
- tablename 为要复制的表明
案例:将old_table表中的数据迁移到new_table表中
./hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=gs-yy-slave1,gs-yy-slave2,gs-yy-slave3:2181:/hbase --new.name=new_table old_table
Export/Import 方式☞
格式:
- bin/hbase org.apache.hadoop.hbase.mapreduce.Export testtable /user/testtable [versions] [starttime] [stoptime]
- bin/hbase org.apache.hadoop.hbase.mapreduce.Import testtable /user/testtable
步骤:
①在old cluster上执行:
./hbase org.apache.hadoop.hbase.mapreduce.Export test hdfs://new cluster ip:9000/zhuangyang/test
②在new cluster上执行:
./hbase org.apache.hadoop.hbase.mapreduce.Import test hdfs://new cluster ip:9000/zhuangyang/test
说明:
①一定要写全路径,不能写相对路劲;
②在import前,需要将表事先在new cluster中创建好.
③以上都是在old cluster和new cluster网络相通的情况下实现数据迁移的办法
快照方式☞
生成快照:
hbase> snapshot 'myTable','myTableSnapshot-20170727'
列出当前所有得快照:
hbase> list_snapshots
删除快照信息:
hbase> delete_snapshot'myTableSnapshot-20170727'
基于快照,clone一个新表:
hbase> clone_snapshot'myTableSnapshot-20170727', 'myNewTestTable'
基于快照恢复表:
hbase> disable 'myTable'
hbase> restore_snapshot'myTableSnapshot-20170727'
导出到另外一个集群中:
$bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot myTableSnapshot-20170727 -copy-to hdfs:///srv2:8082/hbase -mappers 16
案例☞☞☞☞☞☞☞☞☞☞☞☞☞☞☞☞☞☞☞☞☞☞☞
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot user_data_snapshot -copy-to hdfs://192.168.1.45/hbase/ -mappers 8
直接拷贝hdfs对应的文件☞
首先拷贝hdfs文件
bin/hadoop distcp hdfs://192.168.1.45/hbase/testtable/ hdfs://192.168.1.45/hbase/testtable/
然后在目的hbase上执行
bin/hbase org.jruby.Main bin/add_table.rb /hbase/testtable
生成meta信息后,重启hbase
这个操作是简单的方式,操作之前可以关闭hbase的写入,执行flush所有表(上面有介绍),再distcp拷贝。
案例☞
create 'user_data',{NAME => 'info', VERSIONS => 2}
Export/Import
hbase org.apache.hadoop.hbase.mapreduce.Export user_data(要导出的表名) hdfs://192.168.1.45/user/gaoht/user_data(将表数据包导出到hdfs上的哪个位置)
hbase org.apache.hadoop.hbase.mapreduce.Import user_data(要导入的表名) hdfs://192.168.1.45/user/gaoht/user_data(将表数据从hdfs上的这个位置导入到表中)
hbase org.apache.hadoop.hbase.mapreduce.Export user_data hdfs://192.168.1.45/user/gaoht/user_data
hbase org.apache.hadoop.hbase.mapreduce.Import user_data hdfs://192.168.1.45/user/gaoht/user_data
snapshot快照方式
bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot user_data_snapshot -copy-to hdfs:///srv2:8082/hbase -mappers 8
操作:
hbase> snapshot 'myTable','user_data_snapshot'
列出当前所有得快照:
hbase> list_snapshots
删除快照信息:
hbase> delete_snapshot'user_data_snapshot'
基于快照,clone一个新表:
hbase> clone_snapshot'user_data_snapshot', 'myNewTestTable'
基于快照恢复表,它需要先禁用表,再进行恢复:
hbase> disable 'myTable'
hbase> restore_snapshot'user_data_snapshot'
案例:将表创建一个快照 然后将快照copy到新集群相应的位置进行恢复这个表数据
snapshot 'user_data', 'user_data_snapshot'
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot user_data_snapshot -copy-to hdfs://new_cluster/hbase/ -mappers 8