问题背景
在 Windows 10 环境下配置 PDI 9.4,使用 Spoon 连接 Carte 服务器时遇到以下问题:
-
HTTP 400 Bad Request -
Invalid byte 2/3 of 2/3-byte UTF-8 sequence -
Spoon 无法连接到 Carte 服务器
-
转换文件无法远程执行
根本原因
Windows 系统默认使用 GBK 编码,而 PDI 9.4 内部使用 UTF-8 编码,导致 XML 数据传输时编码不一致,引发解析错误。
解决方案
第一步:设置系统编码环境变量
cmd下
chcp 65001
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
set KETTLE_NATIVE=Y
第二步:按顺序启动服务
cmd下
# 1. 先启动 Carte 服务
cd /d D:\dev_install\pdi-ce-9.4.0.0-343\data-integration
carte.bat 127.0.0.1 8819
cmd下
# 2. 等待5秒后启动 Spoon
# (使用相同的编码设置)
spoon.bat
第三步:Spoon 中正确配置
-
Slave Server 名称使用英文(避免中文)
-
主机名用 IP 地址:127.0.0.1
-
端口对应:8819
-
用户名/密码:cluster/cluster
关键发现
1. 编码问题是核心
// 错误现象
"Invalid byte 3 of 3-byte UTF-8 sequence"
// 解决方案
chcp 65001 // 将控制台编码改为UTF-8
2. 文件路径影响
-
避免中文路径:将转换文件保存到英文目录
-
使用绝对路径:确保路径不包含特殊字符
3. 启动顺序很重要
必须确保:
-
Carte 服务完全启动(看到
Starting web server on port 8819) -
等待几秒后再启动 Spoon
-
两者使用相同的编码环境
自动化方案
JavaFX 控制程序
// 关键代码:使用 ProcessBuilder 启动服务
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", command);
pb.directory(new File(pdiHome)); // 设置工作目录
pb.start();
配置文件管理
# pdi-config.properties
pdi.home=D:\\dev_install\\pdi-ce-9.4.0.0-343\\data-integration
carte.host=127.0.0.1
carte.port=8819
java.encoding=UTF-8
验证方法
1. 检查 Carte 状态
curl http://127.0.0.1:8819/kettle/status/?xml=Y
2. 测试连接
在 Spoon 中右键 Slave Server → Show Status
3. 简单转换测试
创建一个仅包含 "Generate rows" 和 "Write to log" 的测试转换
常见错误及解决
错误1:400 Bad Request
HTTP Status 400 - http://127.0.0.1:8819/kettle/registerTrans/?xml=Y
解决:确保编码设置为 UTF-8
错误2:Slave Server 找不到
The run configuration cannot locate [server-name]
解决:删除旧的运行配置,重新创建 Slave Server
错误3:XML 解析错误
Invalid byte 2 of 2-byte UTF-8 sequence
解决:检查配置文件的编码格式,确保为 UTF-8
最佳实践
-
统一编码:所有组件都使用 UTF-8 编码
-
英文环境:路径、文件名、配置名尽量使用英文
-
顺序启动:Carte → 等待 → Spoon
-
配置分离:使用配置文件管理路径和参数
-
日志监控:关注 Carte 启动日志中的错误信息
技术要点
try-with-resources 的正确使用
// 自动关闭资源,确保文件流正确释放
try (OutputStream out = Files.newOutputStream(configFile)) {
props.store(out, "配置说明");
} catch (IOException e) {
e.printStackTrace();
}
javafx技术下
ProcessBuilder 的工作目录设置
// 必须设置正确的工作目录,否则找不到批处理文件
pb.directory(new File(pdiHome));
总结
PDI 集群配置的核心在于编码一致性。Windows 环境下需要显式设置 UTF-8 编码,并确保所有组件在相同的编码环境下运行。通过环境变量设置、正确的启动顺序和配置管理,可以有效解决 Spoon 与 Carte 的互联问题。
这个问题的解决过程展示了:
-
问题定位的重要性:从错误信息找到根本原因
-
环境一致性的关键性:编码、路径、版本需要统一
-
自动化工具的价值:通过程序化管理减少人为错误