【HBase运维系列】集群间的数据拷贝-copytable

时间:2022-04-27 21:55:28

场景:数据从老环境拷贝到新环境,两个集群建是可以通讯的


集群间数据备份包括两种,一种是全停止拷贝,一种是动态备份。

动态备份还包括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_表明的格式命名

【HBase运维系列】集群间的数据拷贝-copytable

在50030端口也可以看到响应的进度

【HBase运维系列】集群间的数据拷贝-copytable


问题点:

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的前提,必须要在新集群上建立好对应的表才不会报以上错误!