场景:数据从老环境拷贝到新环境,两个集群建是可以通讯的
集群间数据备份包括两种,一种是全停止拷贝,一种是动态备份。
动态备份还包括replication、copytable以及export import
这里主要讲下copytable的使用。CopyTable是可以复制的部分或全部的表中,既可以在同一个群集或另一个集群的实用程序。
用法如下:
$ bin/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地址,ADR的格式如下:
hbase.zookeeper.quorum:hbase.zookeeper.client.port:zookeeper.znode.parent参数:
* tablename 为要复制的表明
实例:
从一个集群中拷贝TestTable一个小时的数据到另一个集群;
$ bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr=server1,server2,server3:2181:/hbase TestTable* 其中server1,server2,server3是zookeeper的quorum域名
* 2181是zookeeper的端口,默认是2181,如果自己做了定制,请输入你自己集群的zookeeper端口
* zookeeper.znode.parent 默认值是/hbase,如果自己做了定制,请修改对应路径
执行之后,copytable是以job的形式运行的,job的名称以copytable_表明的格式命名
在50030端口也可以看到响应的进度
问题点:
1、两个集群之间的通讯问题
集群之间一般使用hostname访问,/etc/hosts最好设置包含两个集群服务器节点的域名名称。以免做拷贝的时候报位置hostname问题
2、zookeeper 异常问题
Caused by: org.apache.hadoop.hbase.ZooKeeperConnectionException: An error is preventing HBase from connecting to ZooKeeper Caused by: java.io.IOException: Unable to determine ZooKeeper ensemble
如果设置好/etc/hosts就不会出现这个问题。归根结底也是和第一个问题一样。
3、org.apache.hadoop.hbase.TableNotFoundException: APPCrawlURL
copytable的前提,必须要在新集群上建立好对应的表才不会报以上错误!