目录
方案01.Wins 启动,Wins 运行作业,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 在集群模式下运行。
总结
- 本案例中动态集群是伪集群,该集群包括主从服务器,仅当主服务器生效时,整个集群生效。
- 如果本集群中的主服务carte 服务重启了,该集群下的从服务器carte 服务亦需要重新启动,否则该集群不生效。
- spoon 模式可以成功运行集群,而kitchen 不能成功调起集群,可能是某些kettle 特定版本的Bug。