HBase表备份其实就是先将Table导出,再导入两个过程。shell
导出过程apache
//hbase org.apache.hadoop.hbase.mapreduce.Driver export 表名 数据文件位置
//数据文件位置:能够是本地文件目录,也能够是hdfs路径
//当其为前者时,必须加上前缀file://
//当其为后者时,能够直接指定 "/root/test/users",也能够写路径 "hdfs://hadoop01:9000/root/test/users"
//另外,该接口类还提供了一些其它的方法。例如表与表之间的数据拷贝,导入tsv文件(一种数据间以制表符分割的文件)等
//若是"/root/test/users/" 目录已存在则会报错。【表名不用添加引号】ruby
[root@ncst conf]# hbase org.apache.hadoop.hbase.mapreduce.Driver export users file:///root/test/users
注意:这是一个没有reduce的MR过程,从产生的结果文件"/root/test/users/part-m-00000" 能够看出。网络
导入过程
//hbase org.apache.hadoop.hbase.mapreduce.Driver import 表名 数据文件位置
//数据文件位置:可为本地文件目录,也能够为hdfs的路径。
//当其为前者时,必须加上前缀file://
//当其为后者时,能够直接指定 "/root/test/users",也能够写路径 "hdfs://hadoop01:9000/root/test/users"
//新的表必须存在,不然报错
//若是导出的数据不少,导入的时候千万不要把全部的part-m-0000*文件都放到一个目录下开始导入,确定会失败的!
//应该将part-m-0000*文件一个个开始导入。tcp
[root@ncst conf]# hbase org.apache.hadoop.hbase.mapreduce.Driver import bak file:///root/test/users
hbase集群间数据迁移方法总结oop
1、须要在hbase集群停掉的状况下迁移
步骤:
(1)执行hadoop distcp -f filelist "hdfs://new cluster ip:9000/hbasetest"
(2)在new cluster执行./hbase org.jruby.main add_table.rb /hbase/table20111222,将拷贝来的表加入到.meat.中(会出现region的数目不一致的问题,这个须要重启hase才能解决)
说明:(1)filelist为hdfs上的列表文件,内容以下:
/hbase/table20111222
/hbase/table20120131
(2)若是两个集群的hadoop版本不一致,须要在new cluster上执行hadoop distcp,不然会出现读写异常;
2、在集群运行的时候进行数据迁移
一、replication:这个是动态的备份(能够理解为实时备份)
步骤:(1)在old cluster将须要迁移的表属性进行修改:
disable 'your_table'
alter 'your_table', {name => 'family_name', replication_scope => '1'}
enable 'your_table'
(2)打开new cluster集群的replication,修改hbase-site.xml
<property>
<name>hbase.replication</name>
<value>true</value>
</property>
(3)添加peer,在new cluster的hbase shell中执行:add_peer '1','old cluster ip:2181:/hbase',启动replication,执行start_replication
说明:须要两个集群的hadoop版本一致,不然出现读写错误
二、copytable:能够在本集群中拷贝一张表,也能够将表拷贝到其余的集群中。spa
$ bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable [--starttime=X] [--endtime=Y] [--new.name=NEW] [--peer.adr=ADR] tablename
//Demo例子 $ bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr=server1,server2,server3:2181:/hbase TestTable
命令:./hbase org.apache.hadoop.hbase.mapreduce.copytable --peer.adr=new cluster ip:2181:/hbase zy_test
说明:拷贝完成,不须要重启机器,在new cluster中就能够看到该表;
三、export and import
步骤:(1)在old cluster上执行:./hbase org.apache.hadoop.hbase.mapreduce.export test hdfs://new cluster ip:9000/zhuangyang/test
(2)在new cluster上执行:./hbase org.apache.hadoop.hbase.mapreduce.import test hdfs://new cluster ip:9000/zhuangyang/test
说明:(1)必定要写全路径,不能写相对路劲;
(2)在import前,须要将表事先在new cluster中建立好.
以上都是在old cluster和new cluster网络相通的状况下实现数据迁移的办法。
若是两个集群网络不通,只能先将old cluster中的数据都下载到本地或者其余的地方,而后在人工的转移到new cluster上了 code
导入tsv文件到hbase
一、将文件放到hdfsserver
hadoop fs -put ./hly.tsv /user/amy/input/
二、使用以下命令导入tsvxml
直接导入方式:
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator=',' -Dimporttsv.columns=HBASE_ROW_KEY,info:age,info:sex T_Name /user/amy/input/
bulk load方式:
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.bulk.output=/user/hadoop/data -Dimporttsv.separator=',' -Dimporttsv.columns=HBASE_ROW_KEY,info:age,info:sex T_Name /user/amy/input/
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /user/hadoop/data/T_Name T_Name