Kettle学习笔记(一):环境和转换
一、Kettle环境
上次说了kettle的服务器部署,接下来就说说使用过程中遇到的问题。
之前搭建环境中提到了搭建环境要求,在后期使用中,发现JDK的版本也是很重要的。官方给出的开发环境如下,使用的是JDK11。

二、Kettle的设计模式
Kettle共有两类设计模式,转换(Transformation)和作业(Job)。转换用于控制数据处理和流转,作业则用于转换集成和流程控制。
在使用Kettle图形化编辑界面前,需要先对软件进行启动。在Linux运行spoon.sh启动,在windows上则运行Spoon.bat进行启动。
下面就先对转换(Transformation)的基本用法进行介绍。
转换的左侧菜单栏分成两类,分别是主对象树和核心对象。主对象树是当前作业中使用到的相关组件。核心对象则是作业中拥有的全部全部组件。

1)关于DB连接,这里提几个点。
第一、以Mysql为例,连接方式共有三种,这里支持三种方式JDBC、ODBC、JNDI,一般都是用JDBC的方式进行连接,这里不再详细赘述。后面有时间再单独说这三种连结方式的区别。

第二、 数据库连接创建好后可以右键点击共享,点击共享后后面的转换都可以直接进行选择。

第三、 需要在连接选项中增加zeroDateTimeBehavior=convertToNull,这是防止时间异常导致处理报错。

2)转换中拥有大量核心对象,包括输入、输出、流处理、转换、应用、流程、脚本等。由于对象太多就不一一赘述,下面将结合例子来说下一些常用的核心对象。
转换的输入中支持大量方式,常见的输入方式,包括json、cvs、excel、数据库连接等都支持。输出中支持表输出、插入/更新、excel、json等。
首次,使用的场景是表数据的同步,由于有大量历史数据需要同步。选择表输入+表输出。需提前在目标库中建好相应的表,建表时,一定要处理好所有字段必填项和索引。这种情况,也可以通过navicat等工具转储成sql在目标库中执行。开始我以为直接数据库写入要比Kettle效率高很多,但是通过个人对比测试,百万级的数据,数据库直接写入SQL和Kettle工具同步效率相差并不明显(几个小时的任务,直接写入SQL快2小时,自动化情况下效率不明显)。

表输入中,编辑数据库连接,然后获取SQL查询语句,展示SQL时,一定要显示每一个字段,这样会更清晰。在最后一行,记录数量限制,测试阶段可以根据需要拿到的数据量调整,但是一旦正式使用,一定要填写0,否则只会读取有限数据。另外,可以通过预览查看获取的数据。


表输出中,编辑数据库连接,然后选择目标表。关于提交记录数量,默认100,在我的环境中,我测试过1000和10000,结果是1000的效率较高,所以每次提交1000条。其他功能都无需设置。

这样,一个表输入+一个表输出,就完成了一个基本流程。我有两个大表同步都是通过这样的方式完成的,一个数据数量200万,一个数据数量600万。
其次,使用的场景是在历史数据处理完成后的新数据同步和历史数据更新。这里选择表输入+表输入+插入/更新组件。这里使用的逻辑是获取目标数据表中最新一条数据的时间戳。然后通过此时间戳在源数据表查询此时间后新增和修改的数据,然后再插入/更新到目标数据。以下来详细讲解步骤。

第一个表输入,获取目标表最新时间戳。这里需要提醒的是,一定要保证数据库中有数据,不然获取记录为空,会导致流程失败。

第二个表输入。编辑选择数据库连接,然后获取SQL查询语句,在最后的位置拼写SQL查询更新日期。勾选下方替换SQL语句里的变量,然后从步骤插入数据,选择前一步的输入。两个组件间需要按shift画线连接。

第三个插入/更新。编辑选择数据库连接,点击浏览选择目标表。用来查询的关键字选择ID进行对比,这里ID是表的唯一主键。然后在更新字段中获取全部字段,对ID选择不更新,其他字段都进行更新。若不执行更新,可以勾选提交记录数量下的选框。

这样,一个表更新的转换就完成了,对于新增数据会直接进行插入,对于修改数据,会进行更新。如果表没有主键和更新日期,目前还没有想到有什么好的应对办法。
环境和转换基本上就是这样了,下一次笔记说说作业和定时。