Kettle怎么在集群模式下通过kitchen 命令运行job

目录

背景

问题

工具&环境

开发

方案01.Wins 启动,Wins 运行作业,Linux 运行转换

方案02.WinS 启动,作业和转换都在Linux 上运行

方案03.Linux 启动,作业和转换均在Linux 运行

总结


背景

因业务需要,需要将数据处理后传输给其他业务系统。基于开源的情况,选择了kettle 这一ETL 工具,基本可以满足ETL 业务。考虑到高可用的情况,遂采取动态集群的方式去运行。这里说的集群是伪集群,存在主从结构,仅当某一个或某几个从服务器服务down 掉后,该集群依旧生效;若该集群的主服务器服务down 了,整个集群将不可用。

问题

建立一个动态集群(一主三从),并且可以通过spoon 页面运行作业或者转换。但是不能通过kitchen 命令的方式正常运行集群,该方式运行时,转换这个步骤只在主节点上运行,没有实现到集群运行。

工具&环境

JDK: 1.8.0

Kettle: 9.1.0.0

Linux version 3.10.0-1160.el7.x86_64

Windows:windows server2019

开发

笔者是在Wins 环境下的spoon 客户端下开发,测试完成后,再将对应的作业、转换的xml 格式文件上传至Linux 服务器进行发布运行。具体在spoon 工具下怎么开发作业和转换,网上案例很多,请自行网上查询,这里不再累述。这里只进行开发完成后的界面展示及运行。

方案01.Wins 启动,Wins 运行作业,Linux 运行转换

开发页面展示

【转换】

该转换只有【表输入】、【表输出】两个步骤,其中【表输出】控件左上角有CxN, 表示该步骤在集群模式下运行。 

【作业】

该作业只有【Start】、【转换】 两个步骤,其中【转换】就是上一步中的转换,具体配置如下(双击该转换步骤即可查看):

其中【Transformation】配置中的目录${Internal.Entry.Current.Directory} 表示当前目录;【Run configuration】配置中Configuration 3,是我的集群配置名字。具体配置步骤如下:

【转换】- 【主对象树】 -【Run configurations】- 右键 - 【News…】;

截图如下:

注意【Settings】& 【Location】中的配置。

Spoon 运行 

【作业】页面,【F8】或者【F9】都可以,【Run configuration】选择【Pentaho local】;

该方案运行时,主节点为当前服务器,即Wins 服务器,从节点为集群中的定义的3个从服务器。

 运行中的状态:

 运行完成的状态及日志:

 Linux 从服务器上的日志:

$KETTLE_HOME/logs/out.log:

slave1 从服务器1:

2023/07/16 12:34:32 - test_cluster (dynamic_cluster:Dynamic slave [101.82.29.131:8081]) - Dispatching started for transformation [test_cluster (dynamic_cluster:Dynamic slave [101.82.29.131:8081])]
2023/07/16 12:34:32 - 表输出.0 - Connected to database [DB_CONNET] (commit=1000)
2023/07/16 12:34:33 - 表输出.0 - Finished processing (I=338, O=338, R=0, W=338, U=0, E=0)

slave2 从服务器2:

2023/07/16 12:34:31 - test_cluster (dynamic_cluster:Dynamic slave [101.82.29.132:8082]) - Dispatching started for transformation [test_cluster (dynamic_cluster:Dynamic slave [101.82.29.132:8082])]
2023/07/16 12:34:31 - 表输出.0 - Connected to database [DB_CONNECT] (commit=1000)
2023/07/16 12:34:33 - 表输出.0 - Finished processing (I=338, O=338, R=0, W=338, U=0, E=0)

 slave3 从服务器3:

2023/07/16 12:34:31 - test_cluster (dynamic_cluster:Dynamic slave [101.82.29.133:8083]) - Dispatching started for transformation [test_cluster (dynamic_cluster:Dynamic slave [101.82.29.133:8083])]
2023/07/16 12:34:32 - 表输出.0 - Connected to database [DB_CONNECT] (commit=1000)
2023/07/16 12:34:33 - 表输出.0 - Finished processing (I=337, O=337, R=0, W=337, U=0, E=0)

方案02.WinS 启动,作业和转换都在Linux 上运行

与方案【01】中不同是,首先需要更改【作业】中【转换】步骤的转换文件的路径,将路径改成远程主服务器上转换文件的路径,如下图:

 点击【确定】,然后【F8】或【F9】运行,【Run configuration】也需要换成远程主服务器的配置。然后执行即可。

 图中的【Configuration 2】的配置如下:

此时的【Location】配置成主服务器(我这里主服务器配置的是master1,请根据自身的配置填写),不要选择【方案01】 中 【Clustered】。

查看日志

【子服务器】- 【master1】- 右键 - 【Monitor】;

 日志跟【方案01】看到的类似:

分别查看Linux 从服务器上的日志 ,亦跟【方案01】中的日志类似。

方案03.Linux 启动,作业和转换均在Linux 运行

将【方案01】中的作业和转换文件上传至集群的主服务器(Linux)。

[harry@mylinux tmp]$ ls -alt
total 92
-rw-rw-r--  1 rmsprd rmsprd 11162 Jul 16 10:53 test_cluster.kjb
-rw-rw-r--  1 rmsprd rmsprd 39805 Jul 16 10:23 test_cluster.ktr

在主服务器上运行:

#切换到KETTLE_HOME 目录
[harry@mylinux ~]$ cd /app/data-integration/
[harry@mylinux data-integration]$ pwd
/app/data-integration
# 运行job
[harry@mylinux data-integration]$ ./kitchen.sh -file=/home/harry/tmp/test_cluster.kjb  -param:initialsr='B' -level=Basic -logfile=/app/data-integration/logs/test_cluster_kjb.log

主服务器上的日志:

2023/07/16 14:29:50 - test_cluster - Start of job execution
2023/07/16 14:29:50 - test_cluster - Starting entry [转换]
2023/07/16 14:29:50 - 转换 - Using run configuration [Configuration 3]
2023/07/16 14:29:50 - 转换 - Running transformation using the Kettle execution engine
2023/07/16 14:29:50 - test_cluster - Dispatching started for transformation [test_cluster]
2023/07/16 14:29:51 - 表输出.0 - Connected to database [DB_CONNECT] (commit=1000)
2023/07/16 14:29:54 - 表输入.0 - Finished reading query, closing connection.
2023/07/16 14:29:54 - 表输入.0 - Finished processing (I=1013, O=0, R=0, W=1013, U=0, E=0)
2023/07/16 14:29:54 - 表输出.0 - Finished processing (I=0, O=1013, R=1013, W=1013, U=0, E=0)
2023/07/16 14:29:54 - Carte - Installing timer to purge stale objects after 1440 minutes.
2023/07/16 14:29:54 - test_cluster - Finished job entry [转换] (result=[true])
2023/07/16 14:29:54 - test_cluster - Job execution finished
2023/07/16 14:29:54 - Finished!
2023/07/16 14:29:54 - Start=2023/07/16 14:29:50.541, Stop=2023/07/16 14:29:54.761
2023/07/16 14:29:54 - Processing ended after 4 seconds.

 此时日志跟【方案01】【方案02】上的均不同,多了表输入、表输出两行。

 同时集群的从服务器上并无相关日志产生。

表明此次运行并没有启用集群模式。

为什么同样的作业和转换文件,通过spoon 客服端的运行执行可以启用集群模式,而通过kitchen 运行的方案没能成功启用集群模式呢?

经过大量测试和验证,以及网络上其他大神的指导,推测某些特定的Kettle 可能存在着Bug。但结论总归是好的,最终找到了解决方案。

只需手动将【方案01】中的作业文件进行修改即可。

找到作业文件中转换的定义模块,将slave_server_name 和run_configuration 属性给删除,同时确定cluster 属性值是Y。然后重新通过kitchen 调起即可。

 此时主服务器上的日志看起来跟【方案01】【方案02】一样。

2023/07/16 14:50:50 - test_cluster - Start of job execution
2023/07/16 14:50:50 - test_cluster - Starting entry [转换]
2023/07/16 14:50:56 - 转换 - All transformations in the cluster have finished.
2023/07/16 14:50:56 - test_cluster - Finished job entry [转换] (result=[true])
2023/07/16 14:50:56 - test_cluster - Job execution finished
2023/07/16 14:50:56 - Carte - Installing timer to purge stale objects after 1440 minutes.
2023/07/16 14:50:56 - Finished!
2023/07/16 14:50:56 - Start=2023/07/16 14:50:50.262, Stop=2023/07/16 14:50:56.862
2023/07/16 14:50:56 - Processing ended after 6 seconds.

 从服务器slave 1上的日志。

2023/07/16 14:50:54 - test_cluster (dynamic_cluster:Dynamic slave [101.82.29.131:8081]) - Dispatching started for transformation [test_cluster (dynamic_cluster:Dynamic slave [101.82.29.131:8081])]
2023/07/16 14:50:54 - 表输出.0 - Connected to database [DB_CONNET] (commit=1000)
2023/07/16 14:50:56 - 表输出.0 - Finished processing (I=338, O=338, R=0, W=338, U=0, E=0)

从服务器slave2,3 日志类似。

至此,Linux 上成功通过kitchen 调起job 在集群模式下运行。

总结

  1. 本案例中动态集群是伪集群,该集群包括主从服务器,仅当主服务器生效时,整个集群生效。
  2. 如果本集群中的主服务carte 服务重启了,该集群下的从服务器carte 服务亦需要重新启动,否则该集群不生效。
  3. spoon 模式可以成功运行集群,而kitchen 不能成功调起集群,可能是某些kettle 特定版本的Bug。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值