Kettle 9.1 Carte 集群部署指南

单台 CentOS 8 从零搭建 Kettle 9.1 Carte 伪集群:master 8081 与 slave 8082 双实例注册联动,含安装验证、getSlaves 成员确认、systemd 托管与端口占用排障,全程实测。

KettleKettleETLLinux2026/10/12

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.xmllocalhost8081admin / q1w2e3r4carte-master.service
slave/opt/pentaho/carte-slave.xmllocalhost8082admin / q1w2e3r4carte-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

配置键说明:

键值说明
namemaster节点名称,集群内用于识别(slave 的 masters 列表将引用它)
hostnamelocalhost监听地址;多机部署时改为本机对端可达的 IP 或主机名
port8081Web 服务监听端口
username / passwordadmin / q1w2e3r4访问本节点 HTTP 接口与 Web 页面的凭据
masterY声明本节点为主节点

五、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_mastersY启动后主动向 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 为空)

依次检查:

  1. slave 启动日志是否出现 Registered this slave server to master slave server;若出现 401/Connection refused,核对 masters 列表里的 hostname/port/username/password 是否与 master 配置文件一致;
  2. master 配置的 username/password 与 slave 的 masters 节点中的凭据必须完全相同;
  3. 心跳有周期,注册后稍候数秒再查 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

十、参考链接