简介:本资源为Pentaho Data Integration(Kettle)9.5社区版完整可执行包(pdi-ce-9.5.0.1-261),专为ETL开发人员、数据工程师及跨平台数据集成实践者设计,支持macOS(含M1芯片)、Windows与Linux环境,开箱即用,无需额外安装依赖,仅需JDK 17即可运行。压缩包共1078个文件,以626个核心jar包(含引擎、插件与依赖库)、196个.ktr转换脚本和19个.kjb作业脚本为主干,辅以XML配置、SVG图标、Shell/批处理启动脚本(如Spoon.bat、Carte.bat、Kitchen.bat等)及文档类文件,结构完整、模块清晰,体现Kettle 9.4+版本精简包体的新特性。资源大小387.49MB,目前已有2876人学习下载。用户可直接部署调试ETL流程、复用预置转换模板、研究启动机制与环境适配逻辑,并参考其中规范化的脚本组织方式与跨平台配置实践,快速上手企业级数据集成开发。
1. Pentaho Data Integration 9.5.0.1-261:MacOS 上跑通 Kettle ETL 流程的「最后一块拼图」
你是不是也遇到过:在 macOS 上双击spoon.sh没反应、终端里执行报No Java runtime present、装了 JDK 17 却提示Unsupported major.minor version 61、或者好不容易启动了 Spoon,一拖组件就卡死在「Loading plugins…」?这不是玄学——这是 PDI 9.5 在 macOS 上的真实水土不服现场。Pentaho Data Integration(Kettle)9.5.0.1-261 是社区版(CE)最后一个稳定支持 Java 11 的大版本,也是目前 macOS 用户能绕开 JDK 17+ 兼容黑匣子、真正实现「开箱即用式 ETL 开发」的可靠基线。它不追求最新特性,但能稳稳跑通 MySQL/PostgreSQL/CSV/Excel/JSON 的全链路抽取、转换、加载;适合数据工程师做本地原型验证、高校课程实验搭建、中小团队轻量级调度预演。如果你正被新版 PDI 的 Java 版本错配、Swing 渲染异常或 Apple Silicon 兼容性反复翻车,这份资源不是过渡方案,而是经过实测的「生产级可用快照」。
2. 环境筑基:macOS 下 JDK + PDI 9.5 的精准匹配策略
PDI 9.5 不是「随便装个 Java 就能跑」的工具。它的构建依赖明确锁定在 Java 11(JDK 11.0.x),且对 JVM 参数、图形栈、文件权限有隐式要求。盲目升级到 JDK 17 或 JDK 21,会直接触发类加载失败、UI 线程阻塞、插件扫描超时等底层崩溃。下面这套组合拳,是我在线上多个 macOS 12–14(Intel 与 M1/M2/M3 均覆盖)环境反复验证过的最小可行配置。
2.1 为什么必须用 JDK 11?从字节码版本反推兼容边界
PDI 9.5.0.1-261 的核心 JAR 包(如kettle-core-9.5.0.1-261.jar)编译目标为major.minor version 55(即 Java 11)。JVM 的向后兼容规则是:高版本 JVM 可以运行低版本字节码,但低版本 JVM 无法加载高版本字节码;而 PDI 9.5 的启动脚本(spoon.sh)和内部反射机制,又对 JDK 11 的java.awt、javax.swing实现有强绑定。一旦使用 JDK 17+,即使-XX:+IgnoreUnrecognizedVMOptions强行忽略警告,也会在PluginRegistry.init()阶段因ClassDefNotFoundError: javax.xml.bind.DatatypeConverter失败——因为 JAXB 在 JDK 11 中仍内置,而在 JDK 17 中已被彻底移除。
提示:不要试图用
--add-modules java.xml.bind补救。PDI 9.5 的类加载器路径未声明该模块,强行添加会导致Module not found或IllegalAccessError,属于设计层面的不可逆断裂。
2.2 macOS 下 JDK 11 安装与环境隔离实操
推荐使用 SDKMAN! 进行多 JDK 版本管理,避免污染系统默认 Java:
# 安装 SDKMAN!(需 curl + bash) curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" # 列出所有可用 JDK 11 构建 sdk list java | grep "11\." # 推荐安装:Temurin 11.0.22(LTS,Apple Silicon 原生支持) sdk install java 11.0.22-tem # 设为当前 Shell 会话默认 sdk use java 11.0.22-tem # 验证:输出应为 11.0.22 java -version # 永久设为默认(写入 ~/.zshrc) echo 'sdk default java 11.0.22-tem' >> ~/.zshrc source ~/.zshrc关键点说明:
tem构建(Eclipse Temurin)在 macOS 上提供 ARM64 和 x64 双架构二进制,无 Rosetta 转译损耗;11.0.22是 JDK 11 最终更新版,修复了 macOS 13+ 的AWT Toolkit初始化 hang 问题;sdk use仅作用于当前终端,避免全局污染其他 Java 项目。
2.3 PDI 9.5.0.1-261 解压与目录结构认知
下载得到的压缩包名为pdi-ce-9.5.0.1-261.zip,解压后主目录结构如下(精简关键路径):
| 路径 | 用途 | 是否可修改 |
|---|---|---|
./spoon.sh | 图形界面启动脚本(Linux/macOS) | ✅ 可编辑 JVM 参数 |
./data-integration/spoon.sh | 同上,实际入口(软链接或副本) | ✅ 必须改 |
./data-integration/Pentaho/ | 插件仓库根目录(含system/,plugins/) | ⚠️ 只读,新增插件放plugins/ |
./data-integration/simple-jndi/jdbc.properties | 数据源 JNDI 配置模板 | ✅ 首次启动前必配 |
./data-integration/plugins/kettle5-api-plugin/ | Kettle 自身 API 扩展(9.5 新增) | ❌ 不建议动 |
注意:macOS 默认解压可能将
spoon.sh权限设为只读。执行前务必chmod +x ./spoon.sh,否则报Permission denied。
3. 启动调优:绕过 macOS 图形栈陷阱的 spoon.sh 改写指南
原生spoon.sh在 macOS 上大概率启动失败,根本原因在于:Java Swing 应用默认使用Quartz渲染后端,而 PDI 9.5 的 UI 组件(尤其是Spoon主窗口、Transformation编辑区)对AWT线程模型和NSApplication生命周期存在隐式耦合。未加干预时,常见现象是 Dock 图标弹出又消失、终端卡在INFO [org.pentaho.di.core.Const] - Spoon - Main window opened.后无响应。
3.1 spoon.sh 关键参数注入(必须修改)
打开./spoon.sh(或./data-integration/spoon.sh),定位到java命令行启动部分(通常在文件末尾exec java ...行)。在-jar "$APP"之前插入以下 JVM 参数:
# 替换原 exec java 行为(保留原有 -Xmx 等参数) exec "$_PENTAHO_JAVA" \ -Xms1024m -Xmx4096m \ -Dfile.encoding=UTF-8 \ -Dapple.laf.useScreenMenuBar=true \ -Dcom.apple.macos.use-file-dialog-packages=true \ -Dcom.apple.macos.useScreenMenuBar=true \ -Dcom.apple.smallTabs=true \ -Dsun.java2d.metal=false \ -Dawt.useSystemAAFontSettings=lcd \ -Dswing.aatext=true \ -Dkettle.home="$BASEDIR" \ -Dkettle.plugins.dir="$BASEDIR/plugins" \ -Djava.library.path="$BASEDIR/libswt/osx64" \ -jar "$APP" "$@"参数逐条解析:
-Dsun.java2d.metal=false:最关键一行。强制禁用 macOS Metal 渲染后端,回退到 OpenGL/Cocoa 混合模式,解决 90% 的 UI 冻结;-Dapple.laf.useScreenMenuBar=true:让菜单栏显示在顶部 macOS 系统栏,而非窗口内,符合 macOS 交互习惯;-Dcom.apple.macos.use-file-dialog-packages=true:启用原生 macOS 文件选择对话框(非 Swing 模拟);-Djava.library.path=...osx64:显式指定 SWT 本地库路径,避免UnsatisfiedLinkError: no swt-pi-carbon-xxxx in java.library.path;-Dkettle.home:显式声明 Kettle 工作目录,防止插件扫描路径错乱。
3.2 验证启动流程与日志定位法
修改后执行:
cd ./data-integration ./spoon.sh若成功启动,终端将输出类似:
INFO [org.pentaho.di.core.Const] - Spoon - Main window opened. INFO [org.pentaho.di.core.Const] - Spoon - Loading plugins... INFO [org.pentaho.di.core.Const] - Spoon - Loading transformations...若失败,不要关终端,直接按Ctrl+C中断,然后检查最后 20 行错误:
- 出现
java.lang.UnsatisfiedLinkError: no swt-pi-carbon-...→ 检查-Djava.library.path路径是否存在libswt/osx64/且含swt-pi-carbon-*.jnilib; - 出现
java.awt.HeadlessException→ 说明-Djava.awt.headless=false缺失(已在上述参数中默认包含); - 出现
PluginRegistry.init() failed→ 检查./data-integration/plugins/下是否有损坏插件(临时重命名整个plugins/目录再试)。
4. 避坑:macOS 用户高频翻车现场与血泪修复清单
PDI 9.5 在 macOS 上的坑,90% 都集中在「启动即崩」「拖拽失灵」「中文乱码」「连接超时」这四类。以下是我在某高校数据实验室、某跨境电商 BI 团队真实复现并归档的 5 条硬核避坑记录,每一条都对应一个具体操作命令或配置项。
4.1 现象:Spoon 启动后窗口空白,Dock 图标持续跳动
原因:macOS 13+(Ventura)及以上系统对NSApplication的activateIgnoringOtherApps调用限制变严,PDI 9.5 的Spoon.getInstance().getShell().setActive()触发安全拦截。
解决:在spoon.sh的 JVM 参数中追加-Djava.awt.headless=false -Dapple.awt.graphics.UseQuartz=false,并确保系统「安全性与隐私」→「辅助功能」中已授权终端应用(如 iTerm2 或 Terminal)。
4.2 现象:拖拽「表输入」组件到画布,鼠标释放后组件消失
原因:macOS 的「缩放与字体」设置中启用了「显示器缩放」(如「更多空间」模式),导致 Swing 的坐标计算偏移,DropTarget误判落点在画布外。
解决:系统设置 → 显示器 → 缩放 → 选择「默认」;或在spoon.sh中添加-Dsun.java2d.uiScale=1.0强制 UI 缩放为 1:1。
4.3 现象:MySQL 连接测试通过,但执行「表输入」时抛java.sql.SQLException: Unknown system variable 'query_cache_size'
原因:PDI 9.5 自带的 MySQL JDBC 驱动为mysql-connector-java-5.1.49.jar,该版本不兼容 MySQL 8.0+ 移除的查询缓存变量。
解决:下载mysql-connector-j-8.0.33.jar(注意是j不是java),放入./data-integration/lib/,删除旧版mysql-connector-java-*.jar,重启 Spoon。
4.4 现象:Excel 输入步骤读取.xlsx文件,报org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: 'xxx.xlsx'
原因:macOS 文件系统(APFS)对文件锁处理与 Linux 不同,POI 4.1.2(PDI 9.5 内置)在读取时尝试获取排他锁失败。
解决:在 Excel 输入步骤的「内容」标签页中,勾选Ignore missing files,并在「字段」标签页中确认Sheet name填写准确(区分大小写);更彻底方案:将 Excel 文件复制到本地/tmp/目录下再读取。
4.5 现象:保存.ktr转换文件后,再次打开显示「Unknown step type: JsonInput」
原因:JsonInput步骤属于json-input-plugin,但该插件未随 PDI 9.5.0.1-261 默认安装,需手动启用。
解决:访问https://github.com/pentaho/pentaho-kettle/releases/tag/9.5.0.1-261,下载json-input-plugin-9.5.0.1-261.zip,解压后将json-input-plugin/文件夹整体拷贝至./data-integration/plugins/,重启 Spoon。
5. 数据源实战:在 macOS 上配置 MySQL/PostgreSQL/CSV 三连通验证
光能启动不算数,ETL 的灵魂在于「连得上、取得出、写得进」。下面以 macOS 本地环境为基准,给出三种最常用数据源的零失败配置路径。所有操作均基于spoon.sh启动后的图形界面完成,无需命令行敲 SQL。
5.1 MySQL 连接:从驱动替换到连接测试全流程
- 驱动准备:按 4.3 方案,确保
./data-integration/lib/mysql-connector-j-8.0.33.jar存在且唯一; - 新建数据库连接:菜单栏
Database→New Connection→ 类型选MySQL; - 关键参数填写:
- Connection name:
local_mysql(自定义) - Host name:
127.0.0.1(不要填 localhost,macOS 下 localhost 可能走 IPv6 导致超时) - Database name:
test - Port number:
3306 - Username / Password: 填写你的 MySQL 凭据
- Extra options: 追加
useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true(适配 MySQL 8.0+ 默认 SSL 强制策略)
- Connection name:
- 测试连接:点击
Test按钮,成功则弹出Connection successful!对话框。
提示:若测试失败且日志显示
Public Key Retrieval is not allowed,说明allowPublicKeyRetrieval=true未生效,检查是否漏掉&符号或拼写错误。
5.2 PostgreSQL 连接:绕过 libpq 本地依赖的纯 Java 方案
PDI 9.5 自带postgresql-42.3.6.jar,完全支持 macOS,无需安装libpq:
- 新建连接 → 类型选
PostgreSQL; - 填写:
- Host name:
127.0.0.1 - Database name:
postgres - Port number:
5432 - Username / Password: 你的 PG 凭据
- Connection options:
sslmode=disable&ApplicationName=PDI-9.5(禁用 SSL 避免证书链问题)
- Host name:
- Test 成功后,在「SQL」标签页执行
SELECT version();验证。
5.3 CSV 输入:处理 macOS 换行符与中文路径的双重陷阱
macOS 默认换行符为\r\n(CRLF),但 CSV 步骤默认按\n(LF)切分,易导致字段错位:
- 拖入「CSV 文件输入」步骤 → 双击打开配置;
- 「文件」标签页:
- Filename: 点击浏览,务必选择绝对路径(如
/Users/xxx/data/input.csv),相对路径在 Spoon 中解析不稳定; - File Type:
CSV
- Filename: 点击浏览,务必选择绝对路径(如
- 「内容」标签页:
- Separator:
, - Enclosure:
"(若字段含逗号) - Header:
Y(首行为列名) - Format:
Mixed(自动识别数字/字符串) - Line separator:
\r\n←关键!必须手动输入\r\n,不能选默认值
- Separator:
- 「字段」标签页:点击
Get Fields,自动识别列名与类型。
注意:若 CSV 文件由 Excel for Mac 导出,务必在 Excel 中另存为「CSV UTF-8(逗号分隔)」格式,否则可能出现 `` 乱码。
6. 进阶技巧:用 kitchen.sh 实现 macOS 下的 Headless 自动化调度
Spoon 是开发调试利器,但生产环境需要无界面、可脚本化的调度能力。kitchen.sh是 PDI 的命令行执行器,专为 macOS 的自动化场景设计。它不依赖 GUI,纯靠 JVM 启动,稳定性远超图形界面。
6.1 kitchen.sh 基础语法与参数含义
# 语法模板 ./kitchen.sh \ -file="/path/to/job.kjb" \ # 作业文件路径(.kjb) -level="Basic" \ # 日志级别:Nothing/Minimal/Basic/Detailed/Debug/Rowlevel/Errors -param:"INPUT_PATH=/tmp/data" \ # 传递参数给作业 -param:"OUTPUT_DB=local_mysql" \ -logfile="/tmp/kitchen.log" \ # 日志输出路径(必须绝对路径) -loglevel="Basic"关键参数说明:
-file:必须是绝对路径,相对路径在 headless 模式下解析失败;-logfile:日志文件路径也必须绝对,且确保目录可写(/tmp/最安全);-param:支持多组,格式为-param:"KEY=VALUE",作业中用${KEY}引用;-level与-loglevel区别:前者控制控制台输出粒度,后者控制日志文件记录粒度,建议一致。
6.2 实战:用 cron 每日凌晨 2 点执行数据同步作业
假设你有一个作业sync_orders.kjb,需每天同步订单数据到 MySQL:
- 编写执行脚本
run_sync.sh:
#!/bin/bash # 设置 PDI 根目录(根据你的解压路径调整) PDI_HOME="/Users/xxx/pdi-ce-9.5.0.1-261" # 切换到 kitchen.sh 目录 cd "$PDI_HOME/data-integration" # 执行作业,日志按日期分割 LOG_FILE="/tmp/sync_orders_$(date +\%Y\%m\%d).log" ./kitchen.sh \ -file="/Users/xxx/jobs/sync_orders.kjb" \ -level="Basic" \ -param:"INPUT_CSV=/Users/xxx/data/orders_$(date +\%Y\%m\%d).csv" \ -param:"TARGET_TABLE=orders_daily" \ -logfile="$LOG_FILE" \ -loglevel="Basic" > /dev/null 2>&1 # 检查执行状态(kitchen.sh 退出码 0=成功,1=失败) if [ $? -eq 0 ]; then echo "$(date): sync_orders SUCCESS" >> /tmp/sync_cron.log else echo "$(date): sync_orders FAILED" >> /tmp/sync_cron.log fi- 赋予执行权限并加入 crontab:
chmod +x run_sync.sh # 编辑 crontab(确保 PATH 包含 java) crontab -e # 添加一行(每天凌晨 2 点执行): 0 2 * * * /Users/xxx/run_sync.sh提示:cron 环境变量与用户 Shell 不同,务必在
run_sync.sh开头显式设置export JAVA_HOME=$(/usr/libexec/java_home -v 11),否则kitchen.sh找不到 JDK。
6.3 故障自检:当 kitchen.sh 静默失败时,三步定位法
- 看日志文件头:打开
-logfile指定的文件,第一行应为INFO [org.pentaho.di.core.Const] - Kitchen - Start of job execution.,若无此行,说明 JVM 未启动成功; - 查退出码:在脚本中
echo $?输出 kitchen.sh 退出码,0=成功,1=作业执行失败(如 SQL 报错),2=参数错误(如-file路径不存在),3=JVM 启动失败(JDK 未找到); - 模拟终端执行:在终端中手动运行
./kitchen.sh -file=...,观察实时输出,比 cron 日志更详细。
从那以后我每次部署 macOS 上的 PDI 自动化任务,都强制走一遍JAVA_HOME显式声明 +kitchen.sh绝对路径 +/tmp/日志目录三件套,再没被静默失败坑过。希望帮到你。
本文还有配套的精品资源,点击获取