最新消息:天气越来越冷,记得加一件厚衣裳

跨集群提交CopyTable任务备份HBase表

HBase w3sun 1576浏览 0评论

背景

短期画像数据有一部分存储在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表

与本文相关的文章

  • 暂无相关文章!
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址