使用CopyTable同步HBase数据

    xiaoxiao2021-04-15  288

    CopyTable是Hbase提供的一个数据同步工具,可以用于同步表的部分或全部数据。本文介绍如何使用CopyTable同步HBase数据。针对没有hadoop集群的用户,还介绍了单机运行CopyTable的配置和参数。根据我们的测试,在表不压缩的情况下,单机版CopyTable可以达到1小时100G左右的导入速度。10T以下的数据都可以使用CopyTable导入数据。

    准备工作

    1 安装HBaseCopyTable依赖于hadoop mapreduce。如果源HBase集群中开启了mapreduce则可以直接在源集群上运行。否则可以在另一个hadoop集群上安装HBase客户端并将hbase-site.xml文件中的zk地址指向源集群。也可以单机运行,单机运行时,不需要安装hadoop,只要安装了HBase就可以使用hadoop的本地模式运行CopyTable。安装和配置HBase的过程可以参考云HBase相关文档。

    2 创建目标表使用CopyTable同步数据前,需要确保目标表存在。如果不存在需要先创建目标表。强烈建议根据数据的分布情况对目标表进行预分裂,这样能够提高写入速度。

    3 其他准备工作需要将运行CopyTable的机器ip加入HBase的ip白名单,确保可以访问到HBase。需要修改hbase-site.xml文件中的zk地址指向源集群。

    准备工作完成后,就可以运行CopyTable进行数据同步了。

    命令示例

    ./bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable -Dhbase.client.scanner.caching=200 -Dmapreduce.local.map.tasks.maximum=16 -Dmapred.map.tasks.speculative.execution=false --peer.adr=$ZK_IP1,$ZK_IP2,$ZK_IP3:/hbase $TABLE_NAME

    参数说明

    CopyTable常用选项说明如下: startrow 开始行。 stoprow 停止行。 starttime 时间戳(版本号)的最小值。 endtime 时间戳的最大值。如果不指定starttime,endtime不起作用。 peer.adr 目标集群的地址。格式为:hbase.zookeeer.quorum:hbase.zookeeper.client.port:zookeeper.znode.parent families 要同步的列族。多个列族用逗号分隔。 all.cells 删除标记也进行同步。更多参数参见官方文档

    除copytable的参数外, 以下选项也建议在命令中进行设置:(1)对于单机运行的情况,需要指定mapreduce.local.map.tasks.maximum参数,表示并行执行的最大map个数。不指定的话默认是1,所有任务都是串行执行的。(2)hbase.client.scanner.caching建议设置为大于100的数。这个数越大,使用的内存越多,但是会减少scan与服务端的交互次数,对提升读性能有帮助。(3)mapred.map.tasks.speculative.execution建议设置为false,避免因预测执行机制导致数据写两次。

    另外,如果是在E-mapreduce集群上执行CopyTable,需要注意E-mapreduce默认的hbase-site.xml文件中配置了phoenix,所以需要导入phoenix的jar包,否则运行时会报错:-libjars $HBASE_HOME/lib/phoenix-$PhoenixVersion-HBase-$HBaseVersion-server.jar

    性能数据

    我们使用两个云HBase集群来进行导入数据的测试。两个集群配置一致:3台region-server,机器配置为4CPU 8GB,数据盘为SSD云盘。源数据使用hbase pe产生,共16亿条数据,表采用SNAPPY压缩,数据文件大小为71.9GB,共有32个region。数据为单行单列,rowkey长度26字节,列长度100字节。使用一台4CPU 8GB的ECS执行CopyTable,测试结果如下表:

    测试轮次测试条件导入时间导入速度(rec/s)导入速度(MB/s)1-Dhbase.client.scanner.caching=100 -Dmapreduce.local.map.tasks.maximum=161h21min32921815.152在测试1的基础上修改-Dhbase.client.scanner.caching=5001h14min36036016.583在测试2的基础上按照源表数据分布对目标表进行预分裂再进行导入1h5min41025618.88

    测试过程中的相关监控如下:

    测试1

    测试2

    测试3


    最新回复(0)