目录
背景
短期画像数据有一部分存储在HBase(Hadoop Cluster E)中,每天都需要备份[T-5,T]的数据。但是Azkaban执行机上的Hadoop环境和配置文件是为了在Cluster D上提交任务而配置的,和上述HBase隶属于不同的物理集群,这时候需要跨集群提交HBase的CopyTable任务了。如果不考虑资源的情况下在Cluster E任意找一个节点搭建个Azkaban也是可以的。
备份方式的选择HBase自带的CopyTable工具,通过限制起止时间来过滤出需要备份的数据。
CopyTable介绍
CopyTable是Apache HBase内置的一个数据迁移工具,支持HBase集群内单表复制,也支持跨HBase集群表复制,使用上方便、简单,支持HBase表增量复制,支持dest表重命名。由于采用的scan – put方式性能比较差,数据量大时不推荐使用。其本质也是利用MapReduce进行数据拷贝,全路径名为org.apache.hadoop.hbase.mapreduce.CopyTable,目前公司使用的版本是HBase 1.2.0-cdh5.16.2。简单看下用法:
[user@workstation ~]$ hbase org.apache.hadoop.hbase.mapreduce.CopyTable 用法: CopyTable [general options] [--starttime=X] [--endtime=Y] [--new.name=NEW] [--peer.adr=ADR] <tablename> 选项: rs.class 目标集群HBase Region Server接口类,如果与当前集群不同需要指定。 rs.impl 目标集群hbase.regionserver.impl实现类。 startrow 起始行。 stoprow 结束行。 starttime 开始时间(以毫秒为单位的unixtime),若未指定endtime意味着从开始时间到永久。 endtime 结束时间。如果未指定starttime,则忽略。 versions 要复制的cell版本数。 new.name 新表的名称。 peer.adr 目标集群的地址,需要遵循如下格式:hbase.zookeeer.quorum:hbase.zookeeper.client.port:zookeeper.znode.parent(例如10.10.10.1,10.10.10.2,10.10.10.3:2181/hbase) families 要复制的列族列表,多个列族之间以逗号分隔。如果要从sourceCfName复制到destCfName,请指定为sourceCfName:destCfName。如果复制后列族名称保持不变,只需指定cfName即可。 all.cells 对删除标记和已删除的单元格也进行复制。 bulkload 将输入内容写入HFiles,并通过bulk load方式加载到目的表中。 参数: tablename 要复制的源表名称。
使用示例:
假设我们要把HBase表’TestTable’1小时窗口内的数据复制到另一个集群上:
$ bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr=server1,server2,server3:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable
用户可以参考以下通用选项设置来提高数据拷贝性能:
- 建议用户将HBase scanner一次从服务端抓取的数据条数设置为>=100,一个较高的值可能会使用更多的内存但可以减少频繁请求服务器的耗时可能会提高性能。设置方法为-Dhbase.client.scanners.caching=100
- MapReduce推测执行应始终设置为false,以防止两次数据写入,如果开启推测执行则可能造成结果不准确。设置方法为:-Dmapreduce.map.speculative=false
HBase表数据备份
备份任务通过Azkaban执行例行调度,有两个脚本和一个配置文件目录来支持,分别是copy-table.job定义job,copy-table.sh.template定义执行备份任务的脚本,hbase-conf包含操作HBase集群需要的配置文件:
copy-table.job
type=command command=/etc/azkaban/share/prepare_query.sh copy-table.sh.template copy_table.sh command.1=bash copy_table.sh
copy-table.sh.template
#!/bin/bash function to_timestamp { d=$1 ret=$(date -d $d +"%s") ts=`expr $ret \* 1000` echo $ts } set -e set -x # 获取当前路径 cwd=$(cd `dirname $0/`; pwd) # 起始日期 start_day=${day, -5 day} # 截止日期 end_day=${day} # 转换成时间戳的起始时间 start_time=$(to_timestamp ${start_day}) # 转换成时间戳的结束时间 end_time=$(to_timestamp ${end_day}) echo "start time:" ${start_time} echo "end time:" ${end_time} src_table=source_table dst_table=destination_table # 设置目标集群HBase配置文件所在目录 export HBASE_CLASSPATH=$cwd/hbase-conf #开始执行HBase表备份 hbase --config ${cwd}/hbase-conf org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=${dst_table} --starttime=$${start_time} --endtime=${end_time} ${source_table}
hbase-conf
-rw-r--r--@ 1 user staff 5.1K 9 18 2021 mapred-site.xml -rw-r--r--@ 1 user staff 3.6K 9 18 2021 topology.map -rw-r--r--@ 1 user staff 5.7K 9 18 2021 yarn-site.xml -rw-r--r--@ 1 user staff 617B 9 18 2021 hadoop-env.sh -rw-r--r--@ 1 user staff 21B 9 18 2021 __cloudera_generation__ -rw-r--r--@ 1 user staff 66B 9 18 2021 __cloudera_metadata__ -rw-r--r--@ 1 user staff 3.4K 9 18 2021 core-site.xml -rw-r--r--@ 1 user staff 318B 9 18 2021 hbase-env.sh -rw-r--r--@ 1 user staff 3.0K 9 18 2021 hbase-site.xml -rw-r--r--@ 1 user staff 3.1K 9 18 2021 hdfs-site.xml -rw-r--r--@ 1 user staff 0B 9 18 2021 jaas.conf -rw-r--r--@ 1 user staff 312B 9 18 2021 log4j.properties -rw-r--r--@ 1 user staff 315B 9 18 2021 ssl-client.xml
需要注意的是配置文件需要拷贝完全,否则会出现拷贝失败的情况。
转载请注明:雪后西塘 » 跨集群提交CopyTable任务备份HBase表