前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kettle(PDI)的坑,有点大

Kettle(PDI)的坑,有点大

作者头像
源哥
发布2020-06-07 10:49:27
7.7K1
发布2020-06-07 10:49:27
举报
文章被收录于专栏:源哥的专栏源哥的专栏

网络上有不少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下调测并不容易。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档