datax调研及增量更新的思路

 

一、Datax简介

​ DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。

 datax调研及增量更新的思路_第1张图片

 

二、框架设计

DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。

datax调研及增量更新的思路_第2张图片

  • Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
  • Writer: Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
  • Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。

三、简单的调研

前段时间,简单的调研了一下datax,主要通过抽取速度、抽取数据的稳定性,抽取日志,增量抽取等方面进行了datax和kettle之间的对比

3.1抽取速度

先后采用datax和kettle抽取382万左右的数据:从oracle抽取到mysql

datax需要2分30秒:

datax调研及增量更新的思路_第3张图片

 

kettle需要21分钟:

datax调研及增量更新的思路_第4张图片

而将数据量增加至千万级别时:大概1864万左右的数据

datax需要21分钟左右:

datax调研及增量更新的思路_第5张图片

 

kettle需要2小时58分:

datax调研及增量更新的思路_第6张图片

 

 以上datax是在channel为1的情况下测试的,即单线程抽取

 

3.2抽取日志

日志方面,datax和kettle的日志都是比较好的。不过,当datax的job失败时,他的日志更加人性化一点:

提供了任务失败的可能原因:

datax调研及增量更新的思路_第7张图片

3.3抽取稳定性

当我们使用kettle从mysql抽取数据导入到hdfs上时,存在丢数据的情况。

对于datax,目前我们处于调研阶段,只是运行了个demo,并不能确定是否存在丢数据的情况。目前未发现网上有说丢数据的情况

 

3.4增量抽取

增量抽取一般会先从我们自己的数据库中查询出最大的增量标识(一般为id或时间),再从数据源中抽取大于最大标识的数据。

在增量方面,kettle还是支持的很好,但datax缺乏对增量更新的内置支持

 

kettle可以使用工作流的形式,先查询出目标表的最大值,把这个值作为一个变量传入下一个阶段中。

datax调研及增量更新的思路_第8张图片

 

datax:因为datax的job是一个json文件来描述的,增量抽取的where条件需要动态传入,动态修改json文件不是很方便。所以网上的解决办法是在json中的where条件使用占位符,并通过shell脚本来动态传入最大值。

具体可以参考以下两篇博文:

https://blog.csdn.net/quadimodo/article/details/82186788

http://ju.outofmemory.cn/entry/360202

 3.5动态感知namenode的切换

使用kettle往hdfs上导数据时,namenode的地址是在kettle.properties配置文件中配的,所以当我们的集群重启时,namenode有可能发生切换,导致kettle导数据任务失败

而datax往hdfs上导数据时,可以配置namenode 的HA:

 

datax调研及增量更新的思路_第9张图片

3.6其他

当然kettle还有一个优势是有一个可视化界面,我们在服务器中通过vnc可以界面化操作

 

四、增量更新的思路

 

网上提供了一种思路是通过shell脚本来实现的,当然,更重要的是我们已有的增量更新中,不仅有用时间来做增量的,还有通过自增id来抽取的,不同的任务不一样

所以最好是让用户直接配置他们想要的增量字段,通过用户的配置字段确认需要更新的数据范围,实现kettle的那一套。

我在网上找了一个开源项目,虽然跟我们的需求有点不一样,但改改就可以了

https://github.com/Jawf/DataX-Migration

这个项目我大致看了一下,它是将一个库中的表抽取到另一个库中,里面有些是需要改动的地方:

1.在配置文件中,他会取imformation.scheme库中,通过Table表和Column表去查询源数据库的对应表的元数据信息,但里面的查询sql语句是在配置文件中配的,所以在程序中需要动态维护需要导的表名,即执行sql时,需要replace对应的字符串

2.目标数据库中的表是不会自动创建的,需要手动提前创建好

 

转载于:https://www.cnblogs.com/tianyafu/p/9907391.html

你可能感兴趣的:(datax调研及增量更新的思路)