Kettle9入门、使用经验与5个问题

1从转换开始

1 新建转换

kettle中,对于开发一个ETL流程,必须要新建一个转换​​,其中可以配置一组最常见的"表输入→表输出",然后摁Ctrl+S保存,即得到一个.ktr​​文件。因此,转换是利用Kettle开发ETL流程的一个基本单位。

2 表输出、表输出组件

如下所示,当新建了一个test251130的转换后,左边的栏有主对象、核心对象两组,前者主要用于新增DB连接,后者用于拖各种组件,进行配置。

在该转换中,配置了两组""表输入→表输出",按Shift键,连好了线。

说明:

1、共享DB连接:

建立数据库连接时,这里应该可以选择共享,这样便于同一作业下,任一转换都可以获取该DB链接,而无需反复创建


2、表输入组件中的选项

在下图中,选项的第一、二行无需注意,基本不使用;圈出来的三组选项值得注意。

替换SQL语句中的变量:若勾选,则表示在SQL语句栏中使用变量。执行转换时,该组件的SQL语句中,所有的"${xxx}​​"会被作为变量处理,替换上提前设定好的值,来起一个传参的作用。但若是此前没有定义变量的值,则执行转换后会报错。

另外,{x%%qq%%x}​​这样的结构表示,先将qq作为变量进行传值,例如传一个x;再将{xxx}作为变量解析,再一次传值,得到......。

从步骤中插入数据+执行每一行:这俩在使用上,要么同时选择,要么同时不选。它表示的是,从上一组件中获取数据后,在SQL栏中,依次使用"?"来替代每一列;然后只要上游来一条数据,这里的SQL就执行一次,查出一波数据,再给下游处理。

记录数量限制:为0,表示本组件输出行无限制;为其他数,例如10,表示本组件只输出10条数据。所以,该选项一般为0.


3、表输出组件中的选项

如下所示,表输出组件的选项比较简单,首先是裁剪表,勾选后,该转换只要启动,无论上游是否传来需要插入的数据,该组件直接先清空表,然后再执行插入;若不勾选,则直接按上游数据进行插入。

然后是提交数据的记录,表示每次提交多少条insert into xxx(v,v...)语句给数据库。

其他选项,看情况默认即可。



接着,我们保存为一个.ktr文件后,双击画布的空白处,可以发现转换名称、转换文件,二者是不同的值,并不是直接来自文件名,你完全可以修改为不同的值。但实际开发中,我们应该让二者一致,不建议修改转换名称为其他值,尽量保持一致。​

3 表输出的插入速度慢

接着,我们点击启动按钮,选择run后,确定启动,或者按F9去启动。

点击下图中的"步骤度量"选项,会发现,取数/插入的速度并不对等,相差十分悬殊。一段时间后,会发下,读取速度也降了下来,说明使用默认的表输出,数据插入的速度会十分缓慢,只有350条每秒。​

注意,被插入的表,不应该建立索引、分布键、分区等等,以求插入地更快;数据接入一张临时表后,直接写SQL,让增量数据插入新的正式表,这样做是效率比较高的。
注意,在转换中,所有组件都是同时启动的,是并行的,并不建议利用"阻塞数据...."组件+其他方式,使得转换中一些流程有先后关系,即串行,特别是针对同一数据库的同一个表。因为有可能会发生事务不隔离的一些问题。如果确实需要在转换中串行,应该多多测试,确保无问题。

如果确实需要,在一个转换中,实现串行的关系,如下所示,在插入临时表的流程完成后,打印该表的行数,最后输出,但是这个值有时候并不准确。



​​​

4 调优1:改变复制的数量

接着,我们就表输入组件的"改变开始复制的数量"选项,改为3,这里是表示,同时建立三个数据库连接,去提交insert语句,所以应该会快一些。再次执行,查看复制速度,仅以一个流程为例。一段时间后,我们发现,插入速度提高到780条每秒,但是单个组件的插入速度,已经下降到260条/每秒。

​​

5 调优2:DB连接的参数

接着,我们编辑DB连接,设定以下两个参数为0、true(仅适用PostgreSQL),这两个选项的意思是,不要在本地解析SQL语句,直接提交给数据库去解析。再次测试插入速度,达到2600条/每秒,还不错。

复制代码
prepareThreshold         # 0
reWriteBatchedInserts    # true

6 调优3:PgSQL批量插入组件

接着我们将"表输入"组件换为"PostgreSQL批量插入"组件,各个选项与"表输出"组件类似,如下所见,每秒插入17000条每秒,速度满足要求。后续,还可以对该组件,进一步提速,调整复制的数量,但是不可以选"插入前清空",否则有时会发生事务问题,而报错终止,解决办法是提前去清空该表,然后放弃"插入前清空"。

注意:当一个上游的组件连接多个下游的分支时,必须选择分发还是复制的模式,即每个分支发一份原数据,还是每个分支分发一部分数据。


7、变量的使用​

见下节

2、从作业开始

作业,也就是.kjb文件,是利用kettle开发ETL流程的另外一个基本单位。

作业中,基本的逻辑是串行调用,每个组件是在前一个组件执行完后,再执行;如果是某组件后遇到多分枝,则可以选择并行执行,或者是每分支挨个执行。

新建一个作业以后,可以实现如下操作:

①新建若干个转换组件(挂上不同的.ktr文件的绝对路径),然后进行串行调用,实现一条完整的数据链路;

②在不同的转换组件上,挂同一个.ktr的转换文件,然后传不同的参数,实现了同一个转换文件进行若干次不同的调用(就像新建一个存储过程或函数后,在别的存储过程或函数中进行多次调用),而无需建立不同的转换文件;

③在一个作业中,新建作业组件,挂上.kjb文件的绝对路径,实现对它的调用,形成嵌套关系,做到更复杂的逻辑。

1、串行调用,实现一个数据链路
1 新建作业

如下图所示,新建一个作业。在作业中,一般需要一个Start组件作为起始点,但是这并没有什么实际含义;接着拖入几个转换,按Shift键,给它们连成一串(成功组件可加可不加,没有什么意义)。按Ctrl+S,保存在桌面上的一个Kettle-test文件夹中,然后双击画布的空白处,可以看到该作业的属性信息。显而易见,我们在一个Kettle-test文件夹里,保存了一个test251101.kjb文件,

2 引用.ktr文件

双击某个转换后,会发现它背后没有指向任何一个.ktr文件,也意味着它不能发挥任何作用。于是,我们按照前文的内容,设计一个转换,命名为"prd_src抽数",表示从外部数据库抽数到数仓的贴源层,最后得到一个.ktr文件,保存在相同的Kettle-test文件夹里(有相互引用关系的所有.ktr、.kjb文件,一般应该集中放在一个文件夹中,表示放在一起是为了实现一个目的)。

然后,将刚刚设计好的.ktr文件的绝对地址,填入转换组件的空缺路径中,即可在作业中完成引用转换。为了验证这一点,我们右键单击转换组件,选择Open Referenced Object,点击Tranceformation,即可打开对应引用的.ktr文件。

最后,我们将该作业中的转换组件,双击打开,改名为"prd_src抽数"即可。

注意,此时在作业中引用一个转换组件时,背后指向的是一个.ktr文件,且涉及三处命名,.ktr文件的名字→.ktr文件打开后的转换属性的名称→在.kjb文件打开后,引用为转换组件时的名称,三者尽量保持一致,不要搞混淆。

类似的,我们可以继续像这样设计若干个转换,这里我直接采取打印日志,来模拟实际的操作。

3 执行观察结果

摁Ctrl+S保存后,摁F9,点击执行。查看日志,显而易见,每个转换是一个接一个地执行的,也就是串行的。

复制代码
2026/01/16 13:56:10 - Spoon - 正在开始任务...
2026/01/16 13:56:10 - test251101 - 开始执行任务
2026/01/16 13:56:10 - test251101 - 开始项[prd_src抽数]
2026/01/16 13:56:10 - prd_src抽数 - Running transformation using the Kettle execution engine
2026/01/16 13:56:10 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/01/16 13:56:10 - 表输入.0 - Finished reading query, closing connection
2026/01/16 13:56:10 - 写日志.0 - 
2026/01/16 13:56:10 - 写日志.0 - ------------> 行号 1------------------------------
2026/01/16 13:56:10 - 写日志.0 - col1 = prd_src抽数
2026/01/16 13:56:10 - 写日志.0 - 
2026/01/16 13:56:10 - 写日志.0 - ====================
2026/01/16 13:56:10 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/01/16 13:56:10 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/01/16 13:56:10 - test251101 - 开始项[prd_dwd加工]
2026/01/16 13:56:10 - prd_dwd加工 - Running transformation using the Kettle execution engine
2026/01/16 13:56:10 - prd_dwd加工 - 为了转换解除补丁开始  [prd_dwd加工]
2026/01/16 13:56:10 - 表输入.0 - Finished reading query, closing connection
2026/01/16 13:56:10 - 写日志.0 - 
2026/01/16 13:56:10 - 写日志.0 - ------------> 行号 1------------------------------
2026/01/16 13:56:10 - 写日志.0 - col1 = prd_dwd加工
2026/01/16 13:56:10 - 写日志.0 - 
2026/01/16 13:56:10 - 写日志.0 - ====================
2026/01/16 13:56:10 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/01/16 13:56:10 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/01/16 13:56:10 - test251101 - 开始项[prd_dws加工]
2026/01/16 13:56:10 - prd_dws加工 - Running transformation using the Kettle execution engine
2026/01/16 13:56:10 - prd_dws加工 - 为了转换解除补丁开始  [prd_dws加工]
2026/01/16 13:56:10 - 表输入.0 - Finished reading query, closing connection
2026/01/16 13:56:10 - 写日志.0 - 
2026/01/16 13:56:10 - 写日志.0 - ------------> 行号 1------------------------------
2026/01/16 13:56:10 - 写日志.0 - col1 = prd_dws加工
2026/01/16 13:56:10 - 写日志.0 - 
2026/01/16 13:56:10 - 写日志.0 - ====================
2026/01/16 13:56:10 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/01/16 13:56:10 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/01/16 13:56:10 - test251101 - 开始项[成功]
2026/01/16 13:56:10 - test251101 - 完成作业项[成功] (结果=[true])
2026/01/16 13:56:10 - test251101 - 完成作业项[prd_dws加工] (结果=[true])
2026/01/16 13:56:10 - test251101 - 完成作业项[prd_dwd加工] (结果=[true])
2026/01/16 13:56:10 - test251101 - 完成作业项[prd_src抽数] (结果=[true])
2026/01/16 13:56:10 - test251101 - 任务执行完毕
2026/01/16 13:56:10 - Spoon - 任务已经结束.
2 传参数,复用.ktr文件

如下图所示,在生产中,我们常常会面对这样的情况,在一条数据链路上,需要设计4个prd_src抽数的转换组件,等它们四个表的数据都增量更新后,才能进行prd_dwd、prd_dws层的加工。

看起来,我们需要开发四个转换,即开发4个.ktr文件。但假如这四个prd_src抽数的转换组件的模式和逻辑是一致的,只是表名有所区别,那么,我们完全只需要开发一个.ktr文件,然后设置好参数即可。​

1、.ktr文件中设置变量

如下所示,在"prd_src抽数"的转换文件(.ktr文件)中,在表输入组件中,设置${v_a}变量作为一个列(其实作为库名、表名都可以),下方勾选"替换SQL语句中的变量"即可。

2、.ktr文件中设置命名参数

如下所示,在.kjb文件中,点击对应的转换组件,在命名参数栏设置想要传入的变量的值即可。

下列以"prd_src抽数"为例,设置值为'123',其他"prd_src抽数 2"、"prd_src抽数 3"、"prd_src抽数 4"转换组件分别设置为'234'、'345'、'456',图片略。​

3、作业中,多分枝被执行多次的问题

在作业中,一条链路中,多分枝归一的结构中,会因为分支的数量x,导致后续的归一分支被执行x次。如上述的作业示例中,在设置命名参数完成后,进行跑数测试,结果如下所示,会发现"prd_dwd加工"→"prd_dws加工"被执行了4次,原因是上游有四个分支。

复制代码
2026/02/04 11:34:30 - Spoon - 正在开始任务...
2026/02/04 11:34:30 - test251101 - 开始执行任务
2026/02/04 11:34:30 - test251101 - 开始项[prd_src抽数]
2026/02/04 11:34:30 - prd_src抽数 - Running transformation using the Kettle execution engine
2026/02/04 11:34:30 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 11:34:30 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:30 - 写日志.0 - AA = 123
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ====================
2026/02/04 11:34:30 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:30 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:30 - test251101 - 开始项[prd_dwd加工]
2026/02/04 11:34:30 - prd_dwd加工 - Running transformation using the Kettle execution engine
2026/02/04 11:34:30 - prd_dwd加工 - 为了转换解除补丁开始  [prd_dwd加工]
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:30 - 写日志.0 - col1 = prd_dwd加工
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ====================
2026/02/04 11:34:30 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:30 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:30 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:30 - test251101 - 开始项[prd_dws加工]
2026/02/04 11:34:30 - prd_dws加工 - Running transformation using the Kettle execution engine
2026/02/04 11:34:30 - prd_dws加工 - 为了转换解除补丁开始  [prd_dws加工]
2026/02/04 11:34:30 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:30 - 写日志.0 - col1 = prd_dws加工
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ====================
2026/02/04 11:34:30 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:30 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:30 - test251101 - 开始项[成功]
2026/02/04 11:34:30 - test251101 - 完成作业项[成功] (结果=[true])
2026/02/04 11:34:30 - test251101 - 完成作业项[prd_dws加工] (结果=[true])
2026/02/04 11:34:30 - test251101 - 完成作业项[prd_dwd加工] (结果=[true])
2026/02/04 11:34:30 - test251101 - 完成作业项[prd_src抽数] (结果=[true])
2026/02/04 11:34:30 - test251101 - 开始项[prd_src抽数 2]
2026/02/04 11:34:30 - prd_src抽数 2 - Running transformation using the Kettle execution engine
2026/02/04 11:34:30 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 11:34:30 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:30 - 写日志.0 - AA = 234
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ====================
2026/02/04 11:34:30 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:30 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:30 - test251101 - 开始项[prd_dwd加工]
2026/02/04 11:34:30 - prd_dwd加工 - Running transformation using the Kettle execution engine
2026/02/04 11:34:30 - prd_dwd加工 - 为了转换解除补丁开始  [prd_dwd加工]
2026/02/04 11:34:30 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:30 - 写日志.0 - col1 = prd_dwd加工
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ====================
2026/02/04 11:34:30 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:30 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:30 - test251101 - 开始项[prd_dws加工]
2026/02/04 11:34:30 - prd_dws加工 - Running transformation using the Kettle execution engine
2026/02/04 11:34:30 - prd_dws加工 - 为了转换解除补丁开始  [prd_dws加工]
2026/02/04 11:34:30 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:30 - 写日志.0 - col1 = prd_dws加工
2026/02/04 11:34:30 - 写日志.0 - 
2026/02/04 11:34:30 - 写日志.0 - ====================
2026/02/04 11:34:30 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:30 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:30 - test251101 - 开始项[成功]
2026/02/04 11:34:30 - test251101 - 完成作业项[成功] (结果=[true])
2026/02/04 11:34:30 - test251101 - 完成作业项[prd_dws加工] (结果=[true])
2026/02/04 11:34:30 - test251101 - 完成作业项[prd_dwd加工] (结果=[true])
2026/02/04 11:34:30 - test251101 - 完成作业项[prd_src抽数 2] (结果=[true])
2026/02/04 11:34:30 - test251101 - 开始项[prd_src抽数 3]
2026/02/04 11:34:30 - prd_src抽数 3 - Running transformation using the Kettle execution engine
2026/02/04 11:34:30 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 11:34:31 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:31 - 写日志.0 - AA = 345
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ====================
2026/02/04 11:34:31 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:31 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:31 - test251101 - 开始项[prd_dwd加工]
2026/02/04 11:34:31 - prd_dwd加工 - Running transformation using the Kettle execution engine
2026/02/04 11:34:31 - prd_dwd加工 - 为了转换解除补丁开始  [prd_dwd加工]
2026/02/04 11:34:31 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:31 - 写日志.0 - col1 = prd_dwd加工
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ====================
2026/02/04 11:34:31 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:31 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:31 - test251101 - 开始项[prd_dws加工]
2026/02/04 11:34:31 - prd_dws加工 - Running transformation using the Kettle execution engine
2026/02/04 11:34:31 - prd_dws加工 - 为了转换解除补丁开始  [prd_dws加工]
2026/02/04 11:34:31 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:31 - 写日志.0 - col1 = prd_dws加工
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ====================
2026/02/04 11:34:31 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:31 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:31 - test251101 - 开始项[成功]
2026/02/04 11:34:31 - test251101 - 完成作业项[成功] (结果=[true])
2026/02/04 11:34:31 - test251101 - 完成作业项[prd_dws加工] (结果=[true])
2026/02/04 11:34:31 - test251101 - 完成作业项[prd_dwd加工] (结果=[true])
2026/02/04 11:34:31 - test251101 - 完成作业项[prd_src抽数 3] (结果=[true])
2026/02/04 11:34:31 - test251101 - 开始项[prd_src抽数 4]
2026/02/04 11:34:31 - prd_src抽数 4 - Running transformation using the Kettle execution engine
2026/02/04 11:34:31 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 11:34:31 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:31 - 写日志.0 - AA = 456
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ====================
2026/02/04 11:34:31 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:31 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:31 - test251101 - 开始项[prd_dwd加工]
2026/02/04 11:34:31 - prd_dwd加工 - Running transformation using the Kettle execution engine
2026/02/04 11:34:31 - prd_dwd加工 - 为了转换解除补丁开始  [prd_dwd加工]
2026/02/04 11:34:31 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:31 - 写日志.0 - col1 = prd_dwd加工
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ====================
2026/02/04 11:34:31 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:31 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:31 - test251101 - 开始项[prd_dws加工]
2026/02/04 11:34:31 - prd_dws加工 - Running transformation using the Kettle execution engine
2026/02/04 11:34:31 - prd_dws加工 - 为了转换解除补丁开始  [prd_dws加工]
2026/02/04 11:34:31 - 表输入.0 - Finished reading query, closing connection
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 11:34:31 - 写日志.0 - col1 = prd_dws加工
2026/02/04 11:34:31 - 写日志.0 - 
2026/02/04 11:34:31 - 写日志.0 - ====================
2026/02/04 11:34:31 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 11:34:31 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 11:34:31 - test251101 - 开始项[成功]
2026/02/04 11:34:31 - test251101 - 完成作业项[成功] (结果=[true])
2026/02/04 11:34:31 - test251101 - 完成作业项[prd_dws加工] (结果=[true])
2026/02/04 11:34:31 - test251101 - 完成作业项[prd_dwd加工] (结果=[true])
2026/02/04 11:34:31 - test251101 - 完成作业项[prd_src抽数 4] (结果=[true])
2026/02/04 11:34:31 - test251101 - 任务执行完毕
2026/02/04 11:34:31 - Spoon - 任务已经结束.

因此,改造上述数据链路为下所示,添加对应的"设置变量"、"检验字段的值",两个组件,使得拦截其中三次执行,使其不通过,最后一次可以通过。

但是,该方式中,假如上游的各个分支并行开始执行后,一、二分支依次执行完,此时不通过检测,不执行归一分支;接着,三、四分支同时执行完,也就是同时设置完了变量,此时就可以通过检测,将归一分支执行两次。所以,该方式还是不行。在多次执行后,日志就会发现异常执行。

因为在"设置变量v_p"中,v_p={v_1p}+{v_2p}+{v_3p}+{v_4p}​中最后得到的值的格式是字符串,所以,最后检测时用的v_p变量是否等于"1+1+1+1"。

复制代码
2026/02/04 14:47:40 - Spoon - 正在开始任务...
2026/02/04 14:47:40 - test251101 - 开始执行任务
2026/02/04 14:47:40 - test251101 - 开始项[设置变量初始的值]
2026/02/04 14:47:40 - test251101 - 开始项[prd_src抽数 3]
2026/02/04 14:47:40 - test251101 - 并行启动作业项 [prd_src抽数 3]
2026/02/04 14:47:40 - test251101 - 开始项[prd_src抽数]
2026/02/04 14:47:40 - test251101 - 并行启动作业项 [prd_src抽数]
2026/02/04 14:47:40 - test251101 - 开始项[prd_src抽数 2]
2026/02/04 14:47:40 - test251101 - 并行启动作业项 [prd_src抽数 2]
2026/02/04 14:47:40 - test251101 - 开始项[prd_src抽数 4]
2026/02/04 14:47:40 - test251101 - 并行启动作业项 [prd_src抽数 4]
2026/02/04 14:47:40 - prd_src抽数 3 - Running transformation using the Kettle execution engine
2026/02/04 14:47:40 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 14:47:40 - prd_src抽数 - Running transformation using the Kettle execution engine
2026/02/04 14:47:40 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 14:47:40 - prd_src抽数 2 - Running transformation using the Kettle execution engine
2026/02/04 14:47:40 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 14:47:40 - prd_src抽数 4 - Running transformation using the Kettle execution engine
2026/02/04 14:47:40 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 14:47:40 - 写日志.0 - AA = 234
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ====================
2026/02/04 14:47:40 - 表输入.0 - Finished reading query, closing connection
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 14:47:40 - 写日志.0 - AA = 123
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ====================
2026/02/04 14:47:40 - 表输入.0 - Finished reading query, closing connection
2026/02/04 14:47:40 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 14:47:40 - 写日志.0 - AA = 456
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ====================
2026/02/04 14:47:40 - 表输入.0 - Finished reading query, closing connection
2026/02/04 14:47:40 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 14:47:40 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 14:47:40 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 14:47:40 - test251101 - 开始项[设置变量v_1p]
2026/02/04 14:47:40 - test251101 - 开始项[设置变量]
2026/02/04 14:47:40 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 14:47:40 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 14:47:40 - test251101 - 开始项[检验变量的值v_p]
2026/02/04 14:47:40 - test251101 - 开始项[设置变量v_2p]
2026/02/04 14:47:40 - test251101 - 完成作业项[检验变量的值v_p] (结果=[false])
2026/02/04 14:47:40 - test251101 - 完成作业项[设置变量] (结果=[false])
2026/02/04 14:47:40 - test251101 - 开始项[设置变量]
2026/02/04 14:47:40 - test251101 - 完成作业项[设置变量v_1p] (结果=[false])
2026/02/04 14:47:40 - test251101 - 开始项[检验变量的值v_p]
2026/02/04 14:47:40 - test251101 - 完成作业项[检验变量的值v_p] (结果=[false])
2026/02/04 14:47:40 - test251101 - 完成作业项[设置变量] (结果=[false])
2026/02/04 14:47:40 - test251101 - 完成作业项[设置变量v_2p] (结果=[false])
2026/02/04 14:47:40 - test251101 - 开始项[设置变量v_d]
2026/02/04 14:47:40 - test251101 - 开始项[设置变量]
2026/02/04 14:47:40 - test251101 - 开始项[检验变量的值v_p]
2026/02/04 14:47:40 - test251101 - 完成作业项[检验变量的值v_p] (结果=[false])
2026/02/04 14:47:40 - test251101 - 完成作业项[设置变量] (结果=[false])
2026/02/04 14:47:40 - test251101 - 完成作业项[设置变量v_d] (结果=[false])
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 14:47:40 - 写日志.0 - AA = 345
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ====================
2026/02/04 14:47:40 - 表输入.0 - Finished reading query, closing connection
2026/02/04 14:47:40 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 14:47:40 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 14:47:40 - test251101 - 开始项[设置变量v_3p]
2026/02/04 14:47:40 - test251101 - 开始项[设置变量]
2026/02/04 14:47:40 - test251101 - 开始项[检验变量的值v_p]
2026/02/04 14:47:40 - test251101 - 开始项[prd_dwd加工]
2026/02/04 14:47:40 - prd_dwd加工 - Running transformation using the Kettle execution engine
2026/02/04 14:47:40 - prd_dwd加工 - 为了转换解除补丁开始  [prd_dwd加工]
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 14:47:40 - 写日志.0 - col1 = prd_dwd加工
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ====================
2026/02/04 14:47:40 - 表输入.0 - Finished reading query, closing connection
2026/02/04 14:47:40 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 14:47:40 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 14:47:40 - test251101 - 开始项[prd_dws加工]
2026/02/04 14:47:40 - prd_dws加工 - Running transformation using the Kettle execution engine
2026/02/04 14:47:40 - prd_dws加工 - 为了转换解除补丁开始  [prd_dws加工]
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 14:47:40 - 写日志.0 - col1 = prd_dws加工
2026/02/04 14:47:40 - 写日志.0 - 
2026/02/04 14:47:40 - 写日志.0 - ====================
2026/02/04 14:47:40 - 表输入.0 - Finished reading query, closing connection
2026/02/04 14:47:40 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 14:47:40 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 14:47:40 - test251101 - 开始项[成功]
2026/02/04 14:47:40 - test251101 - 完成作业项[成功] (结果=[true])
2026/02/04 14:47:40 - test251101 - 完成作业项[prd_dws加工] (结果=[true])
2026/02/04 14:47:40 - test251101 - 完成作业项[prd_dwd加工] (结果=[true])
2026/02/04 14:47:40 - test251101 - 完成作业项[检验变量的值v_p] (结果=[true])
2026/02/04 14:47:40 - test251101 - 完成作业项[设置变量] (结果=[true])
2026/02/04 14:47:40 - test251101 - 完成作业项[设置变量v_3p] (结果=[true])
2026/02/04 14:47:40 - test251101 - 完成作业项[设置变量初始的值] (结果=[true])
2026/02/04 14:47:40 - test251101 - 任务执行完毕
2026/02/04 14:47:40 - Spoon - 任务已经结束.
3、作业的嵌套

诸如上一节中的情况,某作业中,上游多个分支进入到下游一个分支时,会被执行多次的情况,此时可以将这多个分支单独设置为一个.kjb作业文件,然后在原.kjb作业文件中,此处设置一个作业组件,引用新增的.kjb作业文件。

①如下图所示,新建一个prd_src并行抽数.kjb作业文件,然后将原来的四个"prd_src抽数X"转换组件复制、粘贴进来,设置好并行执行即可。

②在原作业"test251101"中,新增一个作业组件,然后填入刚刚开发好的.kjb作业文件的的地址,如下图所示,即可。

③多次测试执行,仅执行一次,满足要求。

复制代码
2026/02/04 15:24:42 - prd_src并行抽数 - 开始项[prd_src抽数]
2026/02/04 15:24:42 - prd_src并行抽数 - 并行启动作业项 [prd_src抽数]
2026/02/04 15:24:42 - prd_src并行抽数 - 开始项[prd_src抽数 2]
2026/02/04 15:24:42 - prd_src并行抽数 - 并行启动作业项 [prd_src抽数 2]
2026/02/04 15:24:42 - prd_src并行抽数 - 开始项[prd_src抽数 3]
2026/02/04 15:24:42 - prd_src并行抽数 - 并行启动作业项 [prd_src抽数 3]
2026/02/04 15:24:42 - prd_src并行抽数 - 开始项[prd_src抽数 4]
2026/02/04 15:24:42 - prd_src并行抽数 - 并行启动作业项 [prd_src抽数 4]
2026/02/04 15:24:42 - prd_src抽数 - Running transformation using the Kettle execution engine
2026/02/04 15:24:42 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 15:24:42 - prd_src抽数 3 - Running transformation using the Kettle execution engine
2026/02/04 15:24:42 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 15:24:42 - prd_src抽数 2 - Running transformation using the Kettle execution engine
2026/02/04 15:24:42 - prd_src抽数 4 - Running transformation using the Kettle execution engine
2026/02/04 15:24:42 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 15:24:42 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 15:24:42 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:24:42 - 写日志.0 - 
2026/02/04 15:24:42 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:24:42 - 写日志.0 - AA = 123
2026/02/04 15:24:42 - 写日志.0 - 
2026/02/04 15:24:42 - 写日志.0 - ====================
2026/02/04 15:24:42 - 写日志.0 - 
2026/02/04 15:24:42 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:24:42 - 写日志.0 - AA = 234
2026/02/04 15:24:42 - 写日志.0 - 
2026/02/04 15:24:42 - 写日志.0 - ====================
2026/02/04 15:24:42 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:24:42 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:24:42 - 写日志.0 - 
2026/02/04 15:24:42 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:24:42 - 写日志.0 - AA = 456
2026/02/04 15:24:42 - 写日志.0 - 
2026/02/04 15:24:42 - 写日志.0 - ====================
2026/02/04 15:24:42 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:24:42 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:24:42 - 写日志.0 - 
2026/02/04 15:24:42 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:24:42 - 写日志.0 - AA = 345
2026/02/04 15:24:42 - 写日志.0 - 
2026/02/04 15:24:42 - 写日志.0 - ====================
2026/02/04 15:24:42 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:24:42 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:24:42 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:24:42 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:24:42 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:24:42 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:24:42 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:24:42 - test251101 - 开始项[prd_dwd加工]
2026/02/04 15:24:43 - prd_dwd加工 - Running transformation using the Kettle execution engine
2026/02/04 15:24:43 - prd_dwd加工 - 为了转换解除补丁开始  [prd_dwd加工]
2026/02/04 15:24:43 - 写日志.0 - 
2026/02/04 15:24:43 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:24:43 - 写日志.0 - col1 = prd_dwd加工
2026/02/04 15:24:43 - 写日志.0 - 
2026/02/04 15:24:43 - 写日志.0 - ====================
2026/02/04 15:24:43 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:24:43 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:24:43 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:24:43 - test251101 - 开始项[prd_dws加工]
2026/02/04 15:24:43 - prd_dws加工 - Running transformation using the Kettle execution engine
2026/02/04 15:24:43 - prd_dws加工 - 为了转换解除补丁开始  [prd_dws加工]
2026/02/04 15:24:43 - 写日志.0 - 
2026/02/04 15:24:43 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:24:43 - 写日志.0 - col1 = prd_dws加工
2026/02/04 15:24:43 - 写日志.0 - 
2026/02/04 15:24:43 - 写日志.0 - ====================
2026/02/04 15:24:43 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:24:43 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:24:43 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:24:43 - test251101 - 开始项[成功]
2026/02/04 15:24:43 - test251101 - 完成作业项[成功] (结果=[true])
2026/02/04 15:24:43 - test251101 - 完成作业项[prd_dws加工] (结果=[true])
2026/02/04 15:24:43 - test251101 - 完成作业项[prd_dwd加工] (结果=[true])
2026/02/04 15:24:43 - test251101 - 完成作业项[prd_src并行抽数] (结果=[true])
2026/02/04 15:24:43 - test251101 - 任务执行完毕
2026/02/04 15:24:43 - Spoon - 任务已经结束.

3、在Windows本地,调度执行

开发好的一个或一组.ktr/.kjb文件,除了利用kettle本身的调度系统进行上传、调度、执行,还有一种方法是,在Windows本地,直接在命令行中调度执行该.ktr/.kjb文件,然后新建为定时任务即可。

①进入kettle程序所在的目录,在目录栏,输入cmd,摁Enter,即可打开Power Shell。

②执行.ktr或.kjb文件的命令

在windows系统中,执行.ktr或.kjb文件的命令、注意事项,如下所示:

复制代码
# 运行命令:
Kitchen.bat /file "D:\your_path\your_job.kjb" /param "name1=value1" /param "name2=value2" 
Pan.bat /file "D:\your_path\your_transformation.ktr"  /param "name1=value1" /param "name2=value2" 
  • -param:NAME=VALUE:向作业或转换传递参数,例如 -param:INPUT_FILE=/data/file.csv。
  • /level:设置日志级别(如 Basic, Detailed, Debug),便于调试和监控。
  • /logfile:将日志输出重定向到指定文件。

注意:传参数时,必须要在.ktr文件或.kjb文件中,在转换或作业的属性-命名参数栏,定义好需要传入的参数名,这样外部使用命令行去传参数地调用时,才能正确传入参数;否则传不进去,提示获取不到。

③使用不同的命令调用.kjb文件(调用.ktr文件略)

复制代码
D:\pentaho_1>Kitchen.bat /file "C:\Users\yuerui\Desktop\Kettle-test\test251101.kjb"
D:\pentaho_1>"D:\JAVA\jdk-1.8\bin\java.exe"   "-Xms1024m" "-Xmx2048m" "-Djava.library.path=libswt\win64;/bin" "-Djava.endorsed.dirs=D:\JAVA\jdk-1.8\jre\lib\endorsed;D:\JAVA\jdk-1.8\lib\endorsed;D:\pentaho_1\system\karaf\lib\endorsed"  "-DKETTLE_HOME=" "-DKETTLE_REPOSITORY=" "-DKETTLE_USER=" "-DKETTLE_PASSWORD=" "-DKETTLE_PLUGIN_PACKAGES=" "-DKETTLE_LOG_SIZE_LIMIT=" "-DKETTLE_JNDI_ROOT=" -jar launcher\launcher.jar -lib ..\libswt\win64  -main org.pentaho.di.kitchen.Kitchen -initialDir "D:\pentaho_1"\ /file "D:\LiuSheng\Kettle-test\test251101.kjb"
15:52:18,653 WARN  [KarafBoot] file:/D:/pentaho_1/./system/osgi/log4j2.xml file not exist
15:52:19,288 INFO  [KarafBoot] Checking to see if org.pentaho.clean.karaf.cache is enabled
15:52:22,452 INFO  [KarafInstance]
*******************************************************************************
*** Karaf Instance Number: 4 at D:\pentaho_1\.\system\karaf\caches\kitc ***
***   hen\data-1                                                            ***
*** Karaf Port:8805                                                         ***
*** OSGI Service Port:9054                                                  ***
*******************************************************************************
二月 04, 2026 3:52:22 下午 org.apache.karaf.main.Main launch
..............省略900行日志..............
15:54:06,822 ERROR [KarafLifecycleListener] The Kettle Karaf Lifecycle Listener failed to execute properly after waiting for 100 seconds. Releasing lifecycle hold, but some services may be unavailable.
2026/02/04 15:54:07 - test251101 - 开始执行任务
2026/02/04 15:54:07 - test251101 - 开始项[prd_src并行抽数]
2026/02/04 15:54:07 - prd_src并行抽数 - 开始项[prd_src抽数]
2026/02/04 15:54:07 - prd_src并行抽数 - 并行启动作业项 [prd_src抽数]
2026/02/04 15:54:07 - prd_src并行抽数 - 开始项[prd_src抽数 2]
2026/02/04 15:54:07 - prd_src并行抽数 - 并行启动作业项 [prd_src抽数 2]
2026/02/04 15:54:07 - prd_src并行抽数 - 开始项[prd_src抽数 3]
2026/02/04 15:54:07 - prd_src并行抽数 - 并行启动作业项 [prd_src抽数 3]
2026/02/04 15:54:07 - prd_src并行抽数 - 开始项[prd_src抽数 4]
2026/02/04 15:54:07 - prd_src并行抽数 - 并行启动作业项 [prd_src抽数 4]
2026/02/04 15:54:15 - prd_src抽数 - Running transformation using the Kettle execution engine
2026/02/04 15:54:15 - prd_src抽数 4 - Running transformation using the Kettle execution engine
2026/02/04 15:54:15 - prd_src抽数 2 - Running transformation using the Kettle execution engine
2026/02/04 15:54:15 - prd_src抽数 3 - Running transformation using the Kettle execution engine
2026/02/04 15:54:15 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 15:54:15 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 15:54:15 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 15:54:15 - prd_src抽数 - 为了转换解除补丁开始  [prd_src抽数]
2026/02/04 15:54:16 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:54:16 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:54:16 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:54:16 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:54:16 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:54:16 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:54:16 - 写日志.0 - AA = 345
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ====================
2026/02/04 15:54:16 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:54:16 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:54:16 - 写日志.0 - AA = 123
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ====================
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:54:16 - 写日志.0 - AA = 234
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ====================
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:54:16 - 写日志.0 - AA = 456
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ====================
2026/02/04 15:54:16 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:54:16 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:54:16 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:54:16 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:54:16 - test251101 - 开始项[prd_dwd加工]
2026/02/04 15:54:16 - prd_dwd加工 - Running transformation using the Kettle execution engine
2026/02/04 15:54:16 - prd_dwd加工 - 为了转换解除补丁开始  [prd_dwd加工]
2026/02/04 15:54:16 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:54:16 - 写日志.0 - col1 = prd_dwd加工
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ====================
2026/02/04 15:54:16 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:54:16 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:54:16 - test251101 - 开始项[prd_dws加工]
2026/02/04 15:54:16 - prd_dws加工 - Running transformation using the Kettle execution engine
2026/02/04 15:54:16 - prd_dws加工 - 为了转换解除补丁开始  [prd_dws加工]
2026/02/04 15:54:16 - 表输入.0 - Finished reading query, closing connection
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ------------> 行号 1------------------------------
2026/02/04 15:54:16 - 写日志.0 - col1 = prd_dws加工
2026/02/04 15:54:16 - 写日志.0 -
2026/02/04 15:54:16 - 写日志.0 - ====================
2026/02/04 15:54:16 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2026/02/04 15:54:16 - 写日志.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2026/02/04 15:54:16 - test251101 - 开始项[成功]
2026/02/04 15:54:16 - test251101 - 完成作业项[成功] (结果=[true])
2026/02/04 15:54:16 - test251101 - 完成作业项[prd_dws加工] (结果=[true])
2026/02/04 15:54:16 - test251101 - 完成作业项[prd_dwd加工] (结果=[true])
2026/02/04 15:54:16 - test251101 - 完成作业项[prd_src并行抽数] (结果=[true])
2026/02/04 15:54:16 - test251101 - 任务执行完毕
2026/02/04 15:54:16 - Kitchen - Finished!
2026/02/04 15:54:16 - Kitchen - Start=2026/02/04 15:54:07.025, Stop=2026/02/04 15:54:16.890
2026/02/04 15:54:16 - Kitchen - Processing ended after 9 seconds.

4、使用中的一些问题

1、kettle中,建立DB连接时,不可被命名为中文

2、作业中,并行分支的第一个组件中,出现相同变量时会出现互相干扰

同一作业中,某个转换开启并行,后接入两条分支;每分支的第一个转换,引用的是同一个ktr文件(作用是打印参数sys的值),且命名参数中给同一参数名的赋予不同的值。多次执行下,会发现,大多数情况下两次打印的是同一个值,其余打印的是两个值。

3、PostgreSQL批量加载组件中,选择了清空模式时,有时并不会清空

postgreSQL批量加载组件中,选择了清空模式时,如果(前方的)流中没有数据,那么该组件中并不会清空被加载表中的数据;这一点与表输出组件不同,它在该情况下会清空。

4、一个作业中,"归一分支"被执行N次的问题

一个作业中,某组件及后续组件会因为前方有N个分支,而最终执行N次。

5、在转换中,不要相信事务一致性

同一转换中,利用"阻塞数据直到转换都完成"组件,强令"表输入→表输出"、"执行SQL组件"进行串行的情况下,依次操作:

"表输入:从oracle取数"

→"表输出:插入postgresql临时表"(如下所示,复制数量大为5)

→"阻塞数据直到转换都完成:阻塞数据插入到临时表全部完成"

→"临时表关联正式表,插入正式表"中(数据量百万左右)

最终执行后,会发现临时表中的所有数据量,没有完全插入正式表,会遗漏几百条或几万条不等。

这说明,在一个转换里面,事务是不完全隔离的。​

相关推荐
山岚的运维笔记2 小时前
SQL Server笔记 -- 第16章:MERGE
java·笔记·sql·microsoft·sqlserver
sg_knight2 小时前
如何通过 SQL*Plus 连接 Oracle 数据库(使用 Instant Client)
运维·数据库·sql·oracle·database·关系型数据库·sql puls
Guheyunyi2 小时前
节能降耗系统从“经验直觉”推向“精准智控”
大数据·数据库·人工智能·科技·信息可视化
不剪发的Tony老师2 小时前
Chartbrew:一个开源的数据可视化平台
sql·数据分析·可视化
jiunian_cn2 小时前
【Redis】zset数据类型相关指令
数据库·redis·缓存
betazhou3 小时前
MySQL相关性能查询语句
android·数据库·mysql
jiunian_cn3 小时前
【Redis】set数据类型相关指令
数据库·redis·缓存
松涛和鸣3 小时前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
咩咩不吃草3 小时前
Linux环境下MySQL的安装与使用与Navicat
linux·运维·数据库·mysql·navicat