Return to site

从SQOOP到DATAX

数据仓库工程师的日常

· 数据仓库,技术

Apache Sqoop

Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。

以前工作用到apache sqoop, 以实现 Hive Table到MySQL的Import与Export。

在此之前我的维护代码是类似于这样子的:

(gist code - sqoop_example.sh)

https://gist.github.com/staticor/6664ac843daf910df0e0a3bcbc9d4647

以前我觉得有了sqoop就可以了, 也不会担心速度过快而进行必要限流的问题。

而且接触到的出入上下流都是mysql的rdbms, 也就没想太多, 直到遇到了更"好用"的datax。

DATAX

2018年, 工作变动后我开始接触到datax这套工具。

Datax 是Alibaba开源的离线数据同步平台, 实现了包括MySQL、Oracle、Postgre、HDFS、Hive、ADS、HBase、TableStore、MaxCompute(ODPS)、DRDS等各种数据源间的高效同步。

 

本身作为数据同步的框架,将不同数据源的同步抽象为源reader到源writer的流。

理论上Datax框架支持任意数据源类型的同步工作。 同时Datax插件体系也形成了一套数据同步流的生态系统。

datax 支持的数据源范围

首先吸引我的是其结果显示, 非常直观了然的告诉了导入(出)多少数据, 以及成功、速度如何:

28-12-2018 16:00:27 CST trend_active_user_monthly INFO - 任务启动时刻                    : 2018-12-28 16:00:11 28-12-2018 16:00:27 CST trend_active_user_monthly INFO - 任务结束时刻                    : 2018-12-28 16:00:27 28-12-2018 16:00:27 CST trend_active_user_monthly INFO - 任务总计耗时                    :                 15s 28-12-2018 16:00:27 CST trend_active_user_monthly INFO - 任务平均流量                    :                3B/s 28-12-2018 16:00:27 CST trend_active_user_monthly INFO - 记录写入速度                    :              0rec/s 28-12-2018 16:00:27 CST trend_active_user_monthly INFO - 读出记录总数                    :                   1 28-12-2018 16:00:27 CST trend_active_user_monthly INFO - 读写失败总数                    :                   0

其次datax支持了很多种不同的数据来源与出口。 mysql, postgresql, mongo, .... ...

Hive -> MySQLWriter

MysqlWriter 插件实现了写入数据到 Mysql 主库目标表的功能。

在底层实现上, MysqlWriter 通过 JDBC 连接远程 Mysql 数据库,并执行相应的 insert into ... 或者 ( replace into ...) 的 sql 语句将数据写入 Mysql,内部会分批次提交入库,需要数据库本身采用 innodb 引擎。

- MysqlWriter 面向ETL开发工程师,他们使用 MysqlWriter 从数仓导入数据到 Mysql; 

- MysqlWriter 亦可以作为数据迁移工具为DBA等用户提供服务。

https://github.com/alibaba/DataX/blob/master/mysqlwriter/doc/mysqlwriter.md

 

参考json的gist

 

https://gist.github.com/staticor/953e0c666a27a83b56f799f56a803915

 

以及, 我使用时的用法例子:

 

/usr/bin/python datax.py -p "-Dbizdate=20181224" core_data/daily.json

注意事项: 目标源须是Mysql的主库, 而且操作者要有 INSERT 、 REPLACE目标表(库)的操作权限。

数据类型的转换问题 :

性能问题: 参考github文档中的性能测试小结:

batchSize对性能影响较大, 超过512时, 单线程速度达到 10K rows/second , 而且channel个数在32以下的范围内, channel越多, 速度越快。

在此处添加文本段落。

Hive -> Mongowriter

官方github的文档

 

https://github.com/alibaba/DataX/blob/master/mongodbwriter/doc/mongodbwriter.md

 

示例json的gist地址:

https://gist.github.com/staticor/5741c0628d2adf54feb018afeffe87ed

除了mysql外,我现在还有不少项目要用到mongo。

(在我们公司, 许多项目组都有一些高人"卧虎藏龙于民间", 其中有一位mongo大牛。

受其鼓励, 我们在技术选型时,mongo也受到了更多青睐。

 

MongoDBWriter 插件利用 MongoDB 的java客户端MongoClient进行MongoDB的写操作。

最新版本的Mongo已经将DB锁的粒度从DB级别降低到document级别,配合上MongoDB强大的索引功能,基本可以满足数据源向MongoDB写入数据的需求,针对数据更新的需求,通过配置业务主键的方式也可以实现。

   实现原理

MongoDBWriter通过Datax框架获取Reader生成的数据,然后将Datax支持的类型通过逐一判断转换成MongoDB支持的类型。其中一个值得指出的点就是Datax本身不支持数组类型,但是MongoDB支持数组类型,并且数组类型的索引还是蛮强大的。

 

为了使用MongoDB的数组类型,则可以通过参数的特殊配置,将字符串可以转换成MongoDB中的数组。

 

类型转换之后,就可以依托于Datax框架并行的写入MongoDB。

2019-01-02 10:41:26.999 [job-0] INFO JobContainer -
任务启动时刻 : 2019-01-02 10:16:03
任务结束时刻 : 2019-01-02 10:41:26
任务总计耗时 : 1523s
任务平均流量 : 1.23MB/s
记录写入速度 : 4858rec/s
读出记录总数 : 7335738

个人在某次操作时datax 给出的输出统计。

All Posts
×

Almost done…

We just sent you an email. Please click the link in the email to confirm your subscription!

OK