Kettle 9.1 Carte 集群部署指南
单台 CentOS 8 从零搭建 Kettle 9.1 Carte 伪集群:master 8081 与 slave 8082 双实例注册联动,含安装验证、getSlaves 成员确认、systemd 托管与端口占用排障,全程实测。
Kettle 9.1 Carte 集群部署指南
目标:在单台 CentOS 8 服务器上从零搭建 Pentaho Data Integration(Kettle,下称 PDI)9.1 的 Carte 主从集群(单机伪集群形态):master 实例监听 8081,slave 实例监听 8082 并自动注册到 master,最后通过 status 与 getSlaves 接口验证集群成员关系,并用 systemd 托管两个实例实现开机自启与故障拉起。全文命令与回显已在 CentOS 8(x86_64)实测通过。
一、部署方案与架构规划
1.1 架构说明
Carte 是 PDI 内嵌的轻量 Web 服务器(基于 Jetty),既是远程执行节点,也是集群的组成单元。集群由两类角色组成:
- master(主节点):维护集群成员列表,接收子节点注册与心跳,可作为子转换/子作业的调度入口;
- slave(子节点):实际执行转换/作业的节点,启动时向 masters 列表中的主节点注册(
report_to_masters=Y),周期性上报心跳。
本文采用单机伪集群形态:一台服务器上跑 master(8081)+ slave(8082)两个实例,两实例使用同一份 PDI 程序目录、各自独立的配置文件。该形态与多机集群的配置方式完全一致,差异仅在于多机部署时把 slave 的配置与程序复制到其他服务器、并将 hostname 改为对端可达地址。
1.2 实例与端口规划
| 实例 | 配置文件 | 监听地址 | 端口 | 账号 | systemd 单元 |
|---|---|---|---|---|---|
| master | /opt/pentaho/carte-master.xml | localhost | 8081 | admin / q1w2e3r4 | carte-master.service |
| slave | /opt/pentaho/carte-slave.xml | localhost | 8082 | admin / q1w2e3r4 | carte-slave.service |
二、前置条件与环境准备
2.1 系统要求
- CentOS 8(x86_64),root 或 sudo 权限
- CPU 2 核起步、内存 2 GB 起步(双实例按 256–512 MB JVM 堆配置,实测共占用约 1 GB)
- 磁盘预留约 4 GB(安装包 1.8 GB + 解压后 1.8 GB + 临时空间)
2.2 安装 JDK 8
PDI 9.1 启动脚本与 JDK 11+ 不兼容(详见第八节 8.4),必须使用 JDK 8:
dnf install -y java-1.8.0-openjdk
确认版本:
java -version
实测输出:
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
2.3 安装解压与下载工具
dnf install -y unzip wget curl
三、安装 PDI 9.1
3.1 下载安装包
PDI 9.1 社区版历史官方下载地址(SourceForge pentaho 项目):
mkdir -p /opt/pentaho && cd /opt/pentaho
wget https://sourceforge.net/projects/pentaho/files/Pentaho%209.1/client-tools/pdi-ce-9.1.0.0-324.zip
⚠️ 注意(渠道变迁):Hitachi Vantara 已清空 SourceForge 上 pentaho 项目的文件区,上述历史直链可能返回 404。替代获取方式:企业内部留存的安装包,或从可信的第三方 Docker Hub 镜像(内含完整 PDI 目录结构)提取
data-integration目录后重新打包。
3.2 校验完整性
sha256sum pdi-ce-9.1.0.0-324.zip
实测输出:
0f3c031d6d0a2d6f7eedd918a4f3d44a02006d1c8ccca9b99f7ceded3bb07ad8 pdi-ce-9.1.0.0-324.zip
3.3 解压安装
cd /opt/pentaho
unzip -q pdi-ce-9.1.0.0-324.zip
解压后得到 data-integration 程序目录(解压耗时约 1–3 分钟):
ls /opt/pentaho/data-integration | head -8
实测输出:
ADDITIONAL-FILES
Carte.bat
carte.sh
classes
Data Integration.app
Data Service JDBC Driver
docs
drivers
3.4 赋予脚本执行权限
chmod +x /opt/pentaho/data-integration/*.sh
3.5 配置环境变量
cat > /etc/profile.d/pdi.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0
export PENTAHO_DI_JAVA_OPTIONS="-Xms256m -Xmx512m"
export PATH=$PATH:/opt/pentaho/data-integration
EOF
source /etc/profile.d/pdi.sh
PENTAHO_DI_JAVA_OPTIONS 将两个实例的 JVM 堆统一限制在 256–512 MB。
四、Master 实例配置
创建 /opt/pentaho/carte-master.xml:
cat > /opt/pentaho/carte-master.xml <<'EOF'
<slave_config>
<slaveserver>
<name>master</name>
<hostname>localhost</hostname>
<port>8081</port>
<username>admin</username>
<password>q1w2e3r4</password>
<master>Y</master>
</slaveserver>
</slave_config>
EOF
配置键说明:
| 键 | 值 | 说明 |
|---|---|---|
| name | master | 节点名称,集群内用于识别(slave 的 masters 列表将引用它) |
| hostname | localhost | 监听地址;多机部署时改为本机对端可达的 IP 或主机名 |
| port | 8081 | Web 服务监听端口 |
| username / password | admin / q1w2e3r4 | 访问本节点 HTTP 接口与 Web 页面的凭据 |
| master | Y | 声明本节点为主节点 |
五、Slave 实例配置
创建 /opt/pentaho/carte-slave.xml:
cat > /opt/pentaho/carte-slave.xml <<'EOF'
<slave_config>
<slaveserver>
<name>slave1</name>
<hostname>localhost</hostname>
<port>8082</port>
<username>admin</username>
<password>q1w2e3r4</password>
<master>N</master>
</slaveserver>
<report_to_masters>Y</report_to_masters>
<masters>
<slaveserver>
<name>master</name>
<hostname>localhost</hostname>
<port>8081</port>
<username>admin</username>
<password>q1w2e3r4</password>
<master>Y</master>
</slaveserver>
</masters>
</slave_config>
EOF
除 slaveserver 本节点声明外,slave 多了两个键:
| 键 | 值 | 说明 |
|---|---|---|
| report_to_masters | Y | 启动后主动向 masters 列表中的主节点注册并保持心跳 |
| masters | 列表 | 主节点清单;其中 username/password 必须与 master 配置文件中声明的一致,否则注册请求返回 401 |
六、启动与注册验证
6.1 启动 master 实例
用配置文件方式前台启动(验证阶段建议前台观察日志):
/opt/pentaho/data-integration/carte.sh /opt/pentaho/carte-master.xml
实测输出(尾部,启动约 15–25 秒;前面的 Karaf/OSGI 初始化日志略):
14:27:34,852 INFO [DriverManager] Installing driver kars.
14:27:34,854 INFO [DriverManager] 0 drivers will be installed.
14:27:34,855 INFO [DriverManager] Finished installing drivers kars.
2026/10/12 14:27:34 - Carte - Installing timer to purge stale objects after 1440 minutes.
2026/10/12 14:27:35 - Carte - Created listener for webserver @ address : localhost:8081
看到 Created listener for webserver @ address : localhost:8081 即 master 就绪。保持该窗口运行,另开窗口继续。
6.2 启动 slave 实例
/opt/pentaho/data-integration/carte.sh /opt/pentaho/carte-slave.xml
实测输出(尾部,关键为注册行):
2026/10/12 12:15:45 - Carte - Registered this slave server to master slave server [master] on address [localhost:8081]
2026/10/12 12:15:45 - Carte - Created listener for webserver @ address : localhost:8082
Registered this slave server to master slave server [master] 说明注册成功。
6.3 验证接口鉴权
master(8081)正确凭据访问 status 接口:
curl -s -o /dev/null -w '%{http_code}\n' -u admin:q1w2e3r4 http://localhost:8081/kettle/status/
实测输出:
200
错误凭据(无凭据、或 master 配置里不存在的账号)返回 401:
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8081/kettle/status/
curl -s -o /dev/null -w '%{http_code}\n' -u cluster:cluster http://localhost:8081/kettle/status/
实测输出:
401
401
slave(8082)同样以自己配置文件里的凭据访问:
curl -s -o /dev/null -w '%{http_code}\n' -u admin:q1w2e3r4 http://localhost:8082/kettle/status/
实测输出:
200
6.4 验证集群成员(getSlaves)
向 master 查询已注册的子节点列表:
curl -s -u admin:q1w2e3r4 http://localhost:8081/kettle/getSlaves/
实测输出(全文):
<?xml version="1.0" encoding="UTF-8"?>
<SlaveServerDetections>
<SlaveServerDetection>
<slaveserver>
<name>Dynamic slave [localhost:8082]</name>
<hostname>localhost</hostname>
<port>8082</port>
<webAppName/>
<username>admin</username>
<password>Encrypted 2be98afc86aa7f2e4ba48b922dbc1bd8e</password> <proxy_hostname/>
<proxy_port/>
<non_proxy_hosts/>
<master>N</master>
<sslMode>N</sslMode> </slaveserver>
<active>Y</active>
<last_active_date>2026/10/12 14:27:31.821</last_active_date>
<last_inactive_date/>
</SlaveServerDetection>
</SlaveServerDetections>
要点:Dynamic slave [localhost:8082] 即动态注册进来的 slave,active=Y 表示心跳正常。password 显示为 Encrypted ... 是 master 收到注册信息后的加密回显,属正常现象(slave 侧注册用的仍是配置文件中的明文凭据)。
七、systemd 托管
验证通过后,改用 systemd 托管两个实例(开机自启 + 崩溃自动拉起)。以下两个 unit 文件均将 JVM 堆限制在 256–512 MB。
7.1 master 的 unit 文件
创建 /etc/systemd/system/carte-master.service:
cat > /etc/systemd/system/carte-master.service <<'EOF'
[Unit]
Description=Pentaho Data Integration Carte Master (port 8081)
After=network.target
[Service]
Type=simple
User=root
Environment="PENTAHO_DI_JAVA_OPTIONS=-Xms256m -Xmx512m"
ExecStart=/opt/pentaho/data-integration/carte.sh /opt/pentaho/carte-master.xml
ExecStop=/bin/kill -INT $MAINPID
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
💡 说明:
Environment=为该实例单独注入 JVM 堆参数,优先级高于 /etc/profile.d/pdi.sh 中的同名变量;ExecStop发送 SIGINT 触发 Carte 优雅停机。
7.2 slave 的 unit 文件
创建 /etc/systemd/system/carte-slave.service:
cat > /etc/systemd/system/carte-slave.service <<'EOF'
[Unit]
Description=Pentaho Data Integration Carte Slave (port 8082)
After=network.target carte-master.service
[Service]
Type=simple
User=root
Environment="PENTAHO_DI_JAVA_OPTIONS=-Xms256m -Xmx512m"
ExecStart=/opt/pentaho/data-integration/carte.sh /opt/pentaho/carte-slave.xml
ExecStop=/bin/kill -INT $MAINPID
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
7.3 逐实例启用并启动
先重载 unit 定义,再逐实例设置开机自启:
systemctl daemon-reload
systemctl enable carte-master
实测输出:
Created symlink /etc/systemd/system/multi-user.target.wants/carte-master.service → /etc/systemd/system/carte-master.service.
systemctl enable carte-slave
实测输出:
Created symlink /etc/systemd/system/multi-user.target.wants/carte-slave.service → /etc/systemd/system/carte-slave.service.
启动 master 并确认状态:
systemctl start carte-master
systemctl is-active carte-master
实测输出:
active
启动 slave 并确认状态:
systemctl start carte-slave
systemctl is-active carte-slave
实测输出:
active
7.4 集群状态复核
curl -s -o /dev/null -w 'master:%{http_code}\n' -u admin:q1w2e3r4 http://localhost:8081/kettle/status/
curl -s -o /dev/null -w 'slave:%{http_code}\n' -u admin:q1w2e3r4 http://localhost:8082/kettle/status/
实测输出:
master:200
slave:200
确认两实例 JVM 堆参数均已生效(应看到两行 256/512):
ps -ef | grep [j]ava | grep -o "Xms[0-9]*m -Xmx[0-9]*m"
实测输出:
Xms256m -Xmx512m
Xms256m -Xmx512m
查看 master 单元运行概况:
systemctl status carte-master --no-pager -l | head -6
实测输出:
● carte-master.service - Pentaho Data Integration Carte Master (port 8081)
Loaded: loaded (/etc/systemd/system/carte-master.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2026-10-12 14:40:26 UTC; 44s ago
Main PID: 172 (carte.sh)
Tasks: 107 (limit: 30687)
Memory: 529.8M
八、常见问题
8.1 启动报 Address already in use
现象:启动时打印异常栈尾部:
Caused by: java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
(中间栈帧省略)
at org.pentaho.di.www.WebServer.startServer(WebServer.java:285)
原因:目标端口被旧进程占用(多为此前启动过 Carte 未退干净)。排查并处理:
ss -lntp | grep -E '8081|8082'
找到残留进程后停止它。Carte 的进程主类是 org.pentaho.di.www.Carte,用 pkill 按主类匹配时,建议给匹配串加方括号技巧,避免 pkill 自身命令行被匹配到:
pkill -f "[o]rg.pentaho.di.www.Carte"
若此前前台启动,直接在对应窗口 Ctrl+C 也可。
8.2 slave 注册后 master 查不到(getSlaves 为空)
依次检查:
- slave 启动日志是否出现
Registered this slave server to master slave server;若出现 401/Connection refused,核对masters列表里的hostname/port/username/password是否与 master 配置文件一致; - master 配置的
username/password与 slave 的masters节点中的凭据必须完全相同; - 心跳有周期,注册后稍候数秒再查 getSlaves。
8.3 getSlaves 中 password 显示 Encrypted
master 返回的成员列表里子节点密码形如 Encrypted 2be98afc86aa7f2e4ba48b922dbc1bd8e,这是 PDI 的密码加密回显(防止明文外泄),不是错误,无需处理。
8.4 启动脚本报 -Djava.endorsed.dirs 不支持
现象(JDK 11+ 下启动失败):
-Djava.endorsed.dirs=... is not supported. Endorsed standards and standalone APIs
in modular form will be supported via the concept of upgradeable modules.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
原因与解决:PDI 9.1 启动脚本固定拼接 -Djava.endorsed.dirs,JDK 9+ 已移除该机制。两实例统一改用 JDK 8(见 2.2),并用 java -version 复核当前默认 JDK。
九、卸载与清理
停用并禁用两个 systemd 单元(逐个执行):
systemctl stop carte-slave
systemctl disable carte-slave
systemctl stop carte-master
systemctl disable carte-master
rm -f /etc/systemd/system/carte-master.service /etc/systemd/system/carte-slave.service
systemctl daemon-reload
删除程序目录与配置:
rm -rf /opt/pentaho
rm -f /etc/profile.d/pdi.sh
十、参考链接
- Pentaho Data Integration 官方产品页:https://www.hitachivantara.com/en-us/products/data-management-analytics/pentaho-data-integration.html
- Carte 集群官方文档(Pentaho 集群指南):https://help.pentaho.com/Documentation/9.1/Products/PDI_Clustering
- systemd 单元文件官方文档:https://www.freedesktop.org/software/systemd/man/systemd.service.html