Pentaho Data Integration(简称PDI,其开源版本PDI CE通常也被叫做Kettle)是一款ETL工具集,它专门用于实现数据整合、抽取同步、数据迁移、定时采集等ETL类型的任务。通过PDI的可视化工作流设计界面,用户可以轻松地从多个来源获取数据并进行复杂的数据转换处理操作,实现将数据加载到目标数据库或数据仓库中的目的。此外,PDI是基于EclipseRCP技术编写的,它可以在Windows、Linux、MacOS等支持Java的操作系统上运行,PDI还提供了支持集群模式的服务端组件,我们编写的ETL流程也可以部署到服务器上调度执行。
注:Kettle实际上是PDI的前身,它最初是在2005年由比利时的开发者Matt Casters创建的开源项目,但后来Kettle被Pentaho Corporation收购并成为了Pentaho套件的一部分,此时Kettle被重新命名为Pentaho Data Integration(PDI),但其开源版本(PDI CE)我们仍习惯将其称作Kettle。2015年,Pentaho Corporation又被日立公司收购。
无论是业务支撑系统还是企业资源管理系统等,这些业务系统在运行时会产生各种数据记录,它们可能数据模型各不相同,而且分散在不同的数据库中,甚至同一个字段也有不同的标准(当然这都是历史原因造成的)。当我们的业务规模非常庞大时,就会产生把这些数据抽取出来进行清洗、处理、整合的需求,以供我们对企业的总体运营状态数据进行统筹分析和运用,这个抽取整合数据的过程就叫做ETL(Extract,Transform,Load,即数据的抽取、转换、加载)。
当然,我们可以通过手写程序代码来实现ETL流程,然而这些代码通常会和业务高度耦合难以复用,每次新加需求都要写新的代码,这就需要很大的人力成本,ETL代码也会随着业务和人员变更逐渐变得难以维护,因此各种ETL工具就为了简化这个过程而被设计出来了。ETL流程中实际上有很多概念是可以抽取成可复用的组件的,如数据读取、数据清洗、数据输出等,ETL工具就是这样一些组件的工具集,通过这些组件我们可以迅速组合成完整的ETL流程,实现我们的需求。
当然,Kettle也并非适用于所有情况,以下几点是常见的对于Kettle的抱怨:
Kettle中用作业(Job)表示一组转换过程,用转换(Transformation)表示从一组数据到另一组数据的变换过程,它们还可以互相嵌套,不过通常来说都是Job内部嵌套子Job和Transformation。在图形化编辑器中,我们可以用拖拽流程图的形式编辑Job和Transformation。编辑完成后,会对应生成一些.kjb
和.ktr
文件,这些文件是XML格式的,其中定义了Job和Transformation的描述。通常,生产环境中我们需要把这些脚本放在服务器上,由Carte或操作系统的Crontab调度执行。
Kettle中,作业和转换用上面两个图标表示。
Spoon是一个集成开发环境,前面提到我们需要用.ktr
和.kjb
定义ETL流程,它们本质上是XML格式的文本文件,当然我们不可能手写它们,而是以拖流程图的形式进行定义的,这些文件的可视化编辑器就是Spoon。Spoon是一个使用EclipseRCP开发的图形界面程序,它跨平台支持大多数桌面操作系统。
我们编写好作业和转换后,当然就要执行它们了,在Spoon工具中我们可以执行这些脚本,但实际开发中我们通常要将脚本部署到服务器上。Kitchen和Pan是Kettle中分别用于执行.kjb
和.ktr
的命令行工具(一般来说我们都是使用前者,因为Transformation是嵌套在Job里面的,我们通常不会单独执行Transformation),我们可以直接用Crontab以定时任务的方式调用这两个工具,实现Kettle脚本的定时执行。
Carte是另一个稍微复杂的组件,它包含一个HTTP服务端,能够让我们更方便的进行定时执行等任务的部署,使用Carte就不再需要Crontab了,Carte用于大量Kettle任务的维护。当然如果Kettle的任务并不是很复杂的情况下,Crontab可能更加容易使用。
Kettle早期在SourceForge上维护,但后来PDI CE迁移到了Github上,Kettle程序则可以在其官方页面下载:https://pentaho.com/pentaho-community-edition/
Kettle需要JRE环境才能运行,因此如果我们使用Windows系统还需要提前安装Java。下载好Kettle的压缩包并解压后,我们执行Spoon.bat
脚本(Linux下则是要用对应的Shell文件),该批处理会执行对应的Java启动命令,打开Spoon集成开发环境的图形界面。
Kitchen和Pan等组件的启动脚本也都在Kettle的根目录下,对于这些组件,我们可以把整个包复制到服务器上使用。
此外,早期版本的Kettle可能在新版本的Java环境下无法运行,此时我们需要手动编辑这些启动脚本,设置Java相关的环境变量,使其运行环境指向一个兼容的Java版本,例如在Windows环境下的Kettle7.1版本中,我们在spoon.bat
内加入如下内容,使Spoon以Java8版本启动:
SET JAVA_HOME=C:\Users\Gacfox\sdk\corretto-jdk-8
SET PATH=%JAVA_HOME%\bin;%PATH%
补充:Spoon中有很多专业术语中文翻译不好,而且翻译的不完整,大家都看不懂,因此通常建议调成英文版使用,语言可以在设置中调整。