DataX VS Kettle,深度对比分析

您所在的位置:网站首页 libtech和burton哪个比较好 DataX VS Kettle,深度对比分析

DataX VS Kettle,深度对比分析

2024-07-06 05:01| 来源: 网络整理| 查看: 265

1.前言

开源的 ETL工具里面 DataX和 Kettle的人气一直高居不下,datax虽然比较年轻,但这两年发展势头很猛,不时就能听到身边的同事谈起。kettle作为老牌的 etl工具,诞生年限长,功能完善,特别是其开箱即用的数据转换算子,不得不令人叹服。因此,笔者决定对这两款工具进行深入的对比分析,有多深呢,到源码那种。

2.DataX

DataX 是阿里开源的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS 等各种异构数据源之间高效的数据同步功能。

从 GitHub上可以查到 DataX仓库的创建时间为 2018-01-18T10:09:47Z,是一个比较年轻的项目。

这里以 DataX 3.0为研究对象,从支持的数据源、界面化配置、数据转换能力、扩展性和部署难易程度等方面进行分析介绍。

2.1 数据源支持情况

下面这张表格来自 datax在 github的官方仓库:

类型数据源Reader(读)Writer(写)文档RDBMS 关系型数据库MySQL√√读 、写Oracle√√读 、写OceanBase√√读 、写SQLServer√√读 、写PostgreSQL√√读 、写DRDS√√读 、写Apache Doris√写StarRocks√写通用RDBMS(支持所有关系型数据库)√√读 、写阿里云数仓数据存储ODPS√√读 、写ADS√写OSS√√读 、写OCS√写NoSQL数据存储OTS√√读 、写Hbase0.94√√读 、写Hbase1.1√√读 、写Phoenix4.x√√读 、写Phoenix5.x√√读 、写MongoDB√√读 、写Hive√√读 、写Cassandra√√读 、写无结构化数据存储TxtFile√√读 、写FTP√√读 、写HDFS√√读 、写Elasticsearch√写时间序列数据库OpenTSDB√读TSDB√√读 、写TDengine√√读 、写

从上面这张表格可以看到,datax对流行的 mysql, oracle, sql server和 pg等关系型数据库的支持较好。另外,对 hdfs, hive, hbase等大数据存储的支持度也不错,但对于全文搜索 elasticsearch的支持度较弱,仅支持写入。

总结下,如果是同步关系型数据库、hadoop生态圈的大数据存储、文本格式(csv,json等)的文件等场景,用 datax都是一个挺好的选择。

2.2 界面化配置

datax官方并没有提供配置数据同步任务的界面(至少在 github上没有),另外有一个流行的界面项目 datax-web(4.2k stars),由 WeiYe-Jing发起,但遗憾的是该项目 master分支已经超过两年没有更新,最近一次更新在 2020年6月。

datax-web界面以网页形式在浏览器中进行使用,支持 hive, mysql, oracle, postgresql, sqlserver, hbase, mongodb, clickhouse等数据同步任务的可视化创建,并集成了任务调度组件,支持分布式部署,功能精炼易用。缺点是支持的数据源比 datax官方少了很多,也没有提供数据转换的配置能力。

2.3 数据转换能力

datax官方提供的 transformer只有五个:

dx_substr

获取原字符串指定位置和长度的子字符串

dx_pad

统一字符串长度,长度超过阈值进行截断,长度不足则使用指定的字符进行填充

dx_replace

对字符串进行部分替换,可用于数据脱敏

dx_filter

支持 java的正则表达式,对数据进行过滤

dx_groovy

支持自定义 groovy脚本,可用于对数据进行复杂的转换操作

五个转换算子中,其实只有四个是可以直接使用的算子,最后一个算是对脚本进行了简单支持,满足了一定的扩展性。因为 datax一个核心设计是插件式开发,所以开发自定义 transformer也比较容易,需要继承基类 Transformer,如下:

public class DateTransformer extends Transformer { @Override public Record evaluate(Record record, Object... paras) { // 自定义转换逻辑 return record; } } 2.4 功能扩展性

这里主要分析核心的 reader, writer, transformer三大核心功能的扩展性。

前面已经谈到,datax的开发是插件式思维,对扩展开放。reader插件用于读取数据源,自定义 reader插件需要继承 Reader, Reader.Job, Reader.Task三个类,并实现部分接口。下面是 mysql reader的部分源码:

public class MysqlReader extends Reader { private static final DataBaseType DATABASE_TYPE = DataBaseType.MySql; public static class Job extends Reader.Job { private static final Logger LOG = LoggerFactory .getLogger(Job.class); private Configuration originalConfig = null; private CommonRdbmsReader.Job commonRdbmsReaderJob; @Override public void init() { } ... @Override public void post() { this.commonRdbmsReaderJob.post(this.originalConfig); } @Override public void destroy() { this.commonRdbmsReaderJob.destroy(this.originalConfig); } } public static class Task extends Reader.Task { private Configuration readerSliceConfig; private CommonRdbmsReader.Task commonRdbmsReaderTask; @Override public void init() { this.readerSliceConfig = super.getPluginJobConf(); this.commonRdbmsReaderTask = new CommonRdbmsReader.Task(DATABASE_TYPE,super.getTaskGroupId(), super.getTaskId()); this.commonRdbmsReaderTask.init(this.readerSliceConfig); } @Override public void startRead(RecordSender recordSender) { int fetchSize = this.readerSliceConfig.getInt(Constant.FETCH_SIZE); this.commonRdbmsReaderTask.startRead(this.readerSliceConfig, recordSender, super.getTaskPluginCollector(), fetchSize); } ... } }

writer则是读取数据源的插件,跟 reader类似,自定义 writer插件也需要继承 Writer, Writer.Job, Writer.Task三个类,并实现部分接口。部分源码如下:

public class MysqlWriter extends Writer { private static final DataBaseType DATABASE_TYPE = DataBaseType.MySql; public static class Job extends Writer.Job { private Configuration originalConfig = null; private CommonRdbmsWriter.Job commonRdbmsWriterJob; @Override public void preCheck(){ this.init(); this.commonRdbmsWriterJob.writerPreCheck(this.originalConfig, DATABASE_TYPE); } @Override public void init() { this.originalConfig = super.getPluginJobConf(); this.commonRdbmsWriterJob = new CommonRdbmsWriter.Job(DATABASE_TYPE); this.commonRdbmsWriterJob.init(this.originalConfig); } ... } public static class Task extends Writer.Task { private Configuration writerSliceConfig; private CommonRdbmsWriter.Task commonRdbmsWriterTask; @Override public void init() { this.writerSliceConfig = super.getPluginJobConf(); this.commonRdbmsWriterTask = new CommonRdbmsWriter.Task(DATABASE_TYPE); this.commonRdbmsWriterTask.init(this.writerSliceConfig); } ... } }

transformer已经在 2.3节进行了介绍,这里就不再介绍了。总的来说,datax扩展性很强,开发自定义插件的难度较小,比较适合根据业务进行二次开发和增强。

2.5 部署复杂度

部署 datax非常简单,预先搭建好 JDK1.8+和 python2(3)的环境,然后解压已编译好的 datax安装包即可。

如果是从源码安装,则除了上述要求外还要准备好 Maven 3.x的环境。

3.Kettle

Kettle是开源自 2005年的一款老牌 ETL工具,使用 Java进行编写,核心组件有 spoon, pan, kitchen, carte。如今已被 Pentaho收购,并更名为 Pentaho Data Integration,简称 PDI。

这里以 PDI 9.2为研究对象(9.2以后依赖 JDK11+),同样从支持的数据源、界面化配置、数据转换能力、扩展性和部署难易程度等方面进行分析介绍。

3.1 数据源支持情况 类型数据源读写RDBMS 关系型数据库MySQL√√Oracle√√IBM DB2√√SQLServer√√PostgreSQL√√Teradata√√SQLite√√KingbaseES√√Sybase√√Azure SQL DB√√Apache Derby√√LucidDB√√MonetDB√√Microsoft Access√√通用RDBMS(支持所有关系型数据库)√√NoSQL数据存储HBase√√Hive√√MongoDB√√Cassandra√√Calpont InfiniDB√√Greenplum√√Vertica√√CouchDB√SSTable√无结构化数据存储TxtFile(CSV, Json, LDIF, yaml, xml)√√GZIP CSV√Excel√√LDAP√√Cube√√Rss√√FTP√√HDFS√√Elasticsearch√

上面列出的数据源只是 kettle数据源中比较常见的部分,还有一些小众的未列出。可以看到 kettle对关系型数据库的支持相当好,估计是 ETL工具的天花板了,另外对大数据存储组件的支持也比较完善。对于 es的支持则有些差强人意,官方给的支持是只能写 es,也有资料表明可以使用 kettle运行 ssh命令的功能来读取 es。

3.2 界面化配置

前面提到了 kettle有 spoon, pan, kitchen, carte等四个核心组件,其中 spoon就是 kettle的可视化模块,以客户端的形式存在。

spoon提供了很多核心对象,一些常用的如下:

输入

CSV文件输入、JSON input、表输入、Excel输入、LDAP 输入、LDIF 输入、YAML 输入

输出

Access 输出、Excel输出、插入/更新、数据同步、JSON output、LDAP 输出、SQL 文件输出

转换

Add a checksum、Concat fields、值映射、列拆分多行、列转行、去除重复记录、增加常量、字符串替换

脚本

Java 代码、JavaScript代码、Rules executor、公式、执行SQL脚本、正则表达式

Big Data

HBase input/output、Hadoop file input/output、MongoDB input/output、SSTable output

批量加载

Elastic bulk insert、Greenplum load、MySQL 批量加载、Oracle 批量加载

加密

PGP decrypt/encrypt stream、对称加密、生成秘钥

另外,在实际使用过程中,界面偶尔会出现卡死的现象(win7),只能重启程序。

3.3 数据转换能力

kettle提供了相当多的数据转换算子,3.2节只是列出了部分转换算子,整体来看基本能满足日常的数据转换需求,如果不能满足的还可以编写 Java代码或者 JavaScript代码实现。

3.4 功能扩展性

类似 datax,kettle也是支持插件的,比如 kettle官方提供的 es批量写入插件不支持 7.x版本的 es,可以从 github拉取其 es插件源码进行修改并替换。

以编写 kettle数据库插件为例,需要继承 BaseDatabaseMeta类,并实现 DatabaseInterface接口,如下:

public class DaMengDatabaseMeta extends BaseDatabaseMeta implements DatabaseInterface { private static final String STRICT_BIGNUMBER_INTERPRETATION = "STRICT_NUMBER_38_INTERPRETATION"; @Override public int[] getAccessTypeList() { return new int[] { DatabaseMeta.TYPE_ACCESS_NATIVE, DatabaseMeta.TYPE_ACCESS_JNDI }; } } 3.5 部署复杂度

部署 kettle同样非常简单,预先搭建好 JDK1.8的环境,然后解压已编译好的 kettle安装包即可。

如果是从源码安装,则除了上述要求外还要准备好 Maven 3.x的环境。

4.对比分析 名称诞生时间GitHub流行度数据源界面数据转换扩展性DataX201812.1k stars, 54 contributors关系数据库较好,大数据存储较好,es较差,支持时序数据库一般一般非常好Kettle20056.1k stars, 206 contributors关系数据库非常好,大数据存储较好,es较差较好较好较好

datax比较年轻,且社区活跃度非常高,扩展性非常好,又属于国产化,但是数据转换算子较少,只能对数据做简单的转换,需要较大的开发量。

kettle胜在发展时间长,功能相对更加完善,特别是它的转换类算子非常多,但是架构老化,扩展性弱一些,且界面是以 客户端的形式提供,而不是浏览器页面。

5.总结

datax和 kettle各有优劣,如果开发资源足够,对性能要求高,推荐使用 datax。反之,如果追求开箱即用,功能完备,就更推荐使用 kettle。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3