大数据技术之HBase数据导入工具总结

本文对HBase常用的数据导入工具进行介绍,并结合云HBase常见的导入场景,给出建议的迁移工具和参考资料。

HBase之间数据导入常用工具

HBase提供了几种数据迁移工具,其中基于API调用的有CopyTable,Export&Import。基于写HDFS的有distcp,snapshot。

这里要说明的是,本文作为一般性的介绍,不能忽略常用的工具distcp和snapshot,但是由于云HBase默认不开启HDFS端口,所以在云HBase上面基于HDFS的方法都是用不了的。我们推荐用户使用CopyTable进行迁移,根据我们的测试,CopyTable的性能足以支撑10T以下数据的迁移。如果您的数据量比较大(超过10T),可以联系云HBase工作人员单独为您处理。

CopyTable

CopyTable是HBase提供的一个数据同步工具,可以用于同步表的部分或全部数据。CopyTable通过运行Map-Reduce任务从源表读出数据再写入到目标表。

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同步HBase数据。针对没有Hadoop集群的用户,还介绍单机运行CopyTable的配置和参数。根据我们的测试,在表不压缩的情况下,单机版CopyTable可以达到1小时100G左右的导入速度。10T以下的数据都可以使用CopyTable导入数据。

准备工作

1.安装HBase

CopyTable依赖于hadoop mapreduce。如果源HBase集群中开启了mapreduce则可以直接在源集群上运行。否则可以在另一个hadoop集群上安装HBase客户端并将hbase-site.xml文件中的zk地址指向源集群。

也可以单机运行,单机运行时,不需要安装hadoop,只要安装了HBase就可以使用hadoop的本地模式运行CopyTable。

安装和配置HBase的过程参考https://help.aliyun.com/document_detail/52056.html?spm=a2c4e.11153940.blogcont176546.17.333c5579bR1Adg。

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删除标记也进行同步。

更多参数参见官方文档:http://hbase.apache.org/book.html#copy.table

除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.15

2在测试1的基础上修改-Dhbase.client.scanner.caching=5001h14min36036016.58

3在测试2的基础上按照源表数据分布对目标表进行预分裂再进行导入1h5min41025618.88

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

测试1

Export&Import

Export将HBase表内容dump到一个顺序文件(sequence)中。Import将Export得到的顺序文件内容写入HBase表。和CopyTable一样,Export和Import也是通过运行map-reduce任务来执行的。

Export和Import命令格式:

bin/hbase org.apache.hadoop.hbase.mapreduce.Export[[[]]]

bin/hbase org.apache.hadoop.hbase.mapreduce.Import

distcp

distcp是Hadoop提供的用于复制HDFS文件的工具,经常也被用来同步HBase数据。

使用distcp进行数据同步的步骤如下:

(1)源集群停止写入。

(2)将数据文件复制到目标集群上。运行

hadoopdistcp$SrcFilePath$DstFilePath

(3)然后在目标集群上执行

hbasehbck -fixAssignments -fixMeta

snapshot

HBase snapshot可以在对region-server影响很小的情况下创建快照、将快照复制到另一个集群。

使用snapshot迁移数据的操作步骤如下:

(1)在源表上创建snapshot。

hbasesnapshot create -n$SnapshotName-t$TableName

(2)将snapshot拷贝到目标集群的HDFS上。

hbaseorg.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot$SnapshotName-copy-from$SrcSnapshotPath-copy-to$DstSnapshotPath

(3)在目标集群恢复snapshot。在hbase shell中执行

restore_snapshot'$SnapshotName'

异构数据导入HBase常用工具

其他类型数据向HBase导入常见的工具有:

(1)关系数据库可以使用Sqoop导入。

(2)其他类型数据可以使用DataX。

(3)如果是周期性数据导入需求,可以使用数据集成。

Sqoop

Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具。Sqoop的数据同步也是通过map-reduce实现的。

使用Sqoop同步数据只需要运行一个命令即可,命令示例:

sqoopimport -Dmapreduce.local.map.tasks.maximum=8--connect jdbc:mysql://$mysqlURL:3306/$database--table$table--hbase-table$hbaseTable--column-family$columnFamily--hbase-row-key$mysqlColumn--username$mysqlUser-m8-P

Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具。本文介绍如何使用sqoop将数据从Mysql导入到HBase。从成本的角度考虑,针对没有hadoop集群的用户,重点介绍单机运行sqoop的配置和参数。

安装

要完成从MyDW向HBase导入数据的任务,需要安装和配置的软件包括hadoop,sqoop,mysql-connector和HBase。我们针对单机运行sqoop的情况提供了四合一的安装包简化安装流程。如果是在hadoop集群上运行sqoop,可以参考Sqoop官方文档进行配置。

以下介绍单机版的安装流程。

1.下载安装包。把文件放在~目录。

cd~

wget

http://public-hbase.oss-cn-hangzhou.aliyuncs.com/installpackage/sqoop-all.tar.gz

2.解压文件:解压,进入解压后的目录sqoop-all。

tar-xzvf sqoop-all.tar.gzcd scoop-all

3.设置环境变量。

cpsqoop-env.sh /etc/profile.d;source/etc/profile

4.修改hbase-1.1.9/conf/hbase-site.xml文件,添加集群的 ZK 地址。可参考云HBase帮助文档:https://help.aliyun.com/document_detail/52056.html?spm=a2c4e.11153940.blogcont176524.13.1c1ba954n0tDas

准备工作

1.设置ip白名单。需要把运行sqoop的机器ip添加到云HBase的ip白名单中。如果Mysql是云上的RDS,也需要修改RDS的ip白名单。总之就是保证这台机器能够访问mysql和HBase。

2.确保目标表存在。如果不存在需要先建表。

运行

安装完成并配置好ip白名单之后,就可以运行sqoop进行数据导入了。

命令示例

以下是单机运行sqoop的命令示例:

sqoopimport -Dmapreduce.local.map.tasks.maximum=8--connect jdbc:mysql://$mysqlURL:3306/$database--table$table--hbase-table$hbaseTable--column-family$columnFamily--hbase-row-key$mysqlColumn--username$mysqlUser-m8-P

常用参数说明

--connect JDBC连接字符串

--table 要导入的mysql表名

--columns 要导入的列

--where 过滤条件

--hbase-table hbase表名

--column-family hbase列族

--hbase-row-key 用来做HBase rowkey的mysql列名

--username mysql用户名

-m map个数,默认为4

此外,对于单机运行,还需要指定mapreduce.local.map.tasks.maximum参数,表示并行执行的最大map个数,否则默认为1,map就变成串行执行的了。也可以根据需要调整其他hadoop参数。

sqoop import的其他参数可参考[sqoop-import文档](

http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_literal_sqoop_import_literal)。

公网运行

一般来说,我们不建议在公网执行数据同步任务,因为可能会有潜在的安全隐患以及绕行公网带来的延时增大、性能问题等。但是考虑到开发测试阶段的便利,HBase也提供了公网访问的功能,我们可以通过配置HBase公网访问实现在公网运行数据同步任务。

开通公网访问

开通公网访问的方法参见公网访问方案。

公网访问需要使用阿里云定制的客户端,具体的下载和配置参见使用 Shell 访问。

完成后,如果能通过hbase shell访问,就说明这一步的配置已经成功了。

修改sqoop环境变量

sqoop环境变量中和HBase相关的环境变量主要是HBASE_HOME,需要把这个变量改成阿里云定制客户端所在的目录。运行vi sqoop-en.sh,修改如下内容:

#export HBASE_HOME=~/sqoop-all/hbase-1.1.9 注释这一行,替换成:

exportHBASE_HOME=~/sqoop-all/alihbase-1.1.4#改成阿里云客户端所在的目录

然后

cpsqoop-env.sh /etc/profile.d;source/etc/profile

环境变量生效之后,就可以在公网执行导入操作了。

DataX

DataX 是广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。

DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。

使用DataX进行数据同步的步骤如下:

(1)编写作业的配置文件。配置文件为json格式,具体格式可参考这里:

https://github.com/alibaba/DataX

(2)运行DataX。执行命令

pythondatax.py$config.json

DataX的使用参考官方文档:https://github.com/alibaba/DataX/wiki/Quick-Start?spm=a2c4e.11153940.blogcont178446.21.dacd1078SCL03L

数据集成

数据集成是阿里集团对外提供的的数据同步平台,其底层也基于DataX。由于数据集成提供了调度的功能,所以很适合用于周期性导入数据或是与其他任务有依赖关系的情况。

使用数据集成同步数据的步骤较复杂,具体请参考这里:

https://yq.aliyun.com/articles/165981?spm=a2c4e.11153940.blogcont178446.22.dacd1078SCL03L

云HBase数据迁移指南

场景建议迁移工具参考资料

HBase->HBase,数据量<10TCopyTable使用CopyTable同步HBase数据:

https://yq.aliyun.com/articles/176546?spm=a2c4e.11153940.blogcont178446.23.dacd1078SCL03L

HBase->HBase,数据量>10T联系云HBase工作人员处理

HBase经典网络集群迁移到vpc网络使用ClassicLink打通网络。迁移工具参考具体场景HBase经典网络集群迁移到vpc网络:

https://yq.aliyun.com/articles/328405?spm=a2c4e.11153940.blogcont178446.24.dacd1078SCL03L

关系型数据库->HBaseSqoop使用Sqoop从MySQL向云HBase同步数据:

https://yq.aliyun.com/articles/176524?spm=a2c4e.11153940.blogcont178446.25.dacd1078SCL03L

其他类型数据源一次性导入HBaseDataXDataX官方文档:

https://github.com/alibaba/DataX/wiki/Quick-Start?spm=a2c4e.11153940.blogcont178446.26.dacd1078SCL03L

导入Phoenix表DataxHBase11xsqlwriter插件文档:

https://github.com/alibaba/DataX/blob/master/hbase11xsqlwriter/doc/hbase11xsqlwriter.md?spm=a2c4e.11153940.blogcont178446.27.dacd1078SCL03L&file=hbase11xsqlwriter.md

我自己是一个从事了6年的Java全栈工程师,最近整理了一套适合2019年学习的Java\大数据资料,从基础的Java、大数据面向对象到进阶的框架知识都有整理哦,可以来我的主页免费领取哦。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容