Kettle(PDI)的坑,有点大

2020-06-07 10:49:27 浏览数 (1)

网络上有不少Kettle的文章,但实际上都大同小异,都是些非常基础的文章,实际上在使用过程中还有遇到不少的坑,这部分在网上资料比较少,这里主要讲一下我们在使用过程中遇到的各种问题,属于难得的实践经验。

说起ETL工具,很多人都觉得这个东西简单,不用学Mysql,不用学大数据的编程,简单的通过图形化的拖拉拽,就能实现对数据的抽取、转换、加载,而实际上往往并非如此,在复杂一点的应用场景上,往往就会出现一些意想不到的坑。

低代码化、无码化的系统架构,现在比较流行。Kettle作为一个大数据的ETL工具,现在比较流行,做大数据的报表等,基本上用过图形化拖拉拽来实现,符合无码化的趋势,但实际上用起来可能会发现并不简单,这里会试图把实践中的一些经验共享出来,作为大家在决策是否使用Kettle的一个参考。

  • Kettle是什么

Kettle 是 PDI 以前的名称,PDI 的全称是Pentaho Data Integeration,Kettle 本意是水壶的意思,表达了数据流的含义。Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。

Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。

Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。

Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。

  • 性能瓶颈

虽说Kettle号称是大数据的ETL工具,但实际上其性能瓶颈约束还是比较大,一些大数据工具,像Spark、Flink、Hive,可以轻松实现海量数据的处理,而Kettle虽然也有集群模式,但总体而已很容易出现性能瓶颈。

  • 大数据的数据类型转换问题

我们在做不同数据库之前的数据同步的时候,往往要涉及到数据转换,比如说Mysql往Mongodb同步数据。这个时候往往涉及到数据类型的转换,这个时候往往有些坑,并不容易解决。比如说,Mysql数据同步到Mongodb,数据类型可以在元数据那里定义转换,但是目前能转化的类型有些,并不能完全满足Mongodb的要求,比如说,Integer类型写入到Mongodb为Int64,假如要写入为Int32,目前的没法办法做到。

下面简单展示一下数据转换的方法,一般就是在节点中间增加一个“Select Values”节点,然后在“Meta-data”这个页签里面对原先输入的字段进行类型转换,如下,对_id字段进行转换,转换成整形;对time字段转换成日期格式的字符串。

  • 问题的跟踪和分析

功能开发有时候并不能,但是在系统出问题,需要对问题进行跟踪调试,却往往比较困难和耗时。而Kettle在日志记录,问题调测上还是要困难很多,随着一些程序功能的复杂化,Kettle开发出现的流程可能也越来越复杂,而出现问题的时候,需要定位是哪个环节出现问题,也比较困难。

  • 复杂逻辑处理

往往我们在开发ETL程序的话,并不是简单的做一下ETL动作就行了,而是带有很多的逻辑,比如做if-else分支判断,数据和对象的计算和传递等。往往熟悉编程的话,这些逻辑实现起来非常简单和简洁,而采用Kettle的图形化,实现起来虽然不能说复杂,但工作量并不小。

下面举几个例子:

1.Transformer里面的列表数据传递给上层的Job

假设我们从一个mysql表读取数据,然后再循环对这个读到的数据进行处理,如果采用Java语言开发,那就很简单,读取到的数据放到一个List对象或者ResultSet里面,然后for循环处理就行。而Kettle实现起来则要复杂很多,首先要在一个Transformer里面读取mysql数据,然后存到结果集;在上层的Job里面,需要写一个Javascript,在里面读取结果数据。

如下,圈起来的节点就是将表数据存到结果集:

如下,圈起来的节点就是Javascript里面实现读取数据:

2.IF-ELSE、FOR循环分支

Java中实现if-lese判断很简单,而Kettle相对就比较困难了,一般需要使用一个常量,然后使用多个“Simple evaluation”节点做分支判断。

For循环往往需要使用一个常量,然后采用Javascript循环获取下一个数据。

3.Minus操作

如果要实现类似mysql里面的minus操作(也就是一个数据集减去另外一个数据集),Kettle实现起来要麻烦一些,一般想把两个数据集用full outer join的方式连接起来,然后再做过滤,把两个数据集匹配的数据区分出来,然后再选择剩余的那部分数据。

如下,“Multiway merge join”节点负责将两个表的数据合并起来,“Filter rows”复杂对这部分数据进行分离,“Select values”则对应取分离后的那部分数据,有一部分不需要,则废弃。

4.将变量更新到数据集中

如果要对mysql查询后的数据做变更,比如说增加一个字段,字段的值为某个变量,这个往往需要在mysql的查询中先新增一个值为null的字段,然后在后面增加一个“Set field value to a constant”的节点,把这个字段的值全部设置为常量。

  • Linux下执行

Kettle的图形化界面往往是指Windows下执行的,而实际上,生成的程序往往是指Linux等服务器上实现的,虽然Kettle也可以在Linux上安装图形化,但实际上,为了安全等考虑,都不会安装图形化,所以在Linux下调测并不容易。

0 人点赞