简介:本资源为Kettle核心图形化ETL开发工具Spoon的完整本地部署包,面向数据工程师、ETL开发者及Java技术栈初学者,解决跨平台数据集成环境快速搭建与可视化开发入门问题。压缩包含2867个文件,主体为1586个jar(支撑Spoon运行与插件功能)、200个.ktr(可直接运行的数据转换脚本)、19个.kjb(工作流定义文件)、80个bat/sh启动脚本(覆盖Windows/Linux/Unix多系统),辅以配置类cfg、properties、xml及日志、文档等,整体达938.86MB,开箱即用。已有3782人学习下载,资源包含全量Spoon可执行环境、预置示例转换与工作流、多平台启动脚本(如Spoon.bat、start.sh、client.bat等)及配套配置文件,无需额外编译或依赖安装,可立即开展ETL流程设计、调试与调度实践,特别适合企业级数据整合项目实训与本地化开发验证。
1. Spoon 不是“点点点就能跑通”的图形界面,而是 Kettle(PDI)整套数据集成逻辑的可视化控制台:它不执行任务,只编排、调试、导出和监控真正干活的 Carte 或 Pan/Kitchen
很多人第一次打开 Spoon,以为这是个类似 Excel 插件或数据库 GUI 的“轻量工具”——拖几个组件、连几根线、点下运行,数据就自动流进目标库了。结果卡在“正在连接数据库”十分钟不动,或导出的 transformation 在服务器上死活报ClassNotFoundException,甚至发现本地能跑的 job,一发到 Linux 服务器就提示Unable to load step plugin。这些不是 Spoon 坏了,而是你把它当成了“执行器”,而它本质是元数据编辑器 + 本地调试沙箱 + 部署包生成器。Spoon 本身不调度、不集群、不长期运行;它生成.ktr/.kjb文件,靠 Pan(执行 transformation)、Kitchen(执行 job)、Carte(轻量 Web 调度服务)去落地。你在 Windows 上用 Spoon 配好 Oracle 连接,导出的.ktr文件里存的是 JDBC URL、用户名、密码(明文或加密)、驱动类名——但 Linux 服务器上若没放ojdbc8.jar到lib/目录,或者 Java 版本不匹配(Kettle 9.x 要 JDK 11+),Pan 就会直接跪。这不是配置错误,是环境契约没对齐。适合这组工具的人,不是只想“导个 Excel”,而是需要稳定复用 ETL 流程、跨环境部署、做定时清洗、对接下游 BI 或数仓建模的中阶数据工程师。如果你还在手动写 SQL 脚本改表结构、用 Python 脚本拼接 CSV 再 load,Spoon 就是你该认真投入的“工业化流水线入口”。
2. 从零启动 Spoon:下载、解压、环境校验与首次运行的最小闭环
2.1 下载与解压:认准官方源,避开“kettle下载安装教程”里混杂的镜像站和打包版
Kettle 已于 2022 年正式更名为Pentaho Data Integration(PDI),由 Hitachi Vantara 维护。当前稳定主线是PDI 9.4(截至 2024 年中),支持 JDK 11–17,不再兼容 JDK 8。所谓“kettle下载”实际应访问官方归档页:https://sourceforge.net/projects/pentaho/files/Pentaho%209.4/client-tools/
找到pdi-ce-9.4.0.0-343.zip(CE = Community Edition,免费开源)。注意:
- ❌ 不要下载带
installer后缀的.exe或.dmg—— 它们是旧版(< 8.3)遗留,已弃用; - ❌ 不要从百度网盘、CSDN 资源页下载“绿色免安装版”——常被篡改,缺
libswt或删了carte模块; - ✅ 正确动作:下载 ZIP 包,解压到无中文、无空格路径,例如
/opt/pdi(Linux)或D:\pdi(Windows)。
提示:解压后目录结构必须含
spoon.sh/spoon.bat、lib/、plugins/、system/四大核心目录。少任何一个,说明 ZIP 损坏或解压异常。
2.2 环境预检:三步确认 Java、内存、GUI 库就绪(尤其 Linux 环境部署 kettle)
Spoon 是基于 SWT(Standard Widget Toolkit)的 Java 桌面应用,对 Java 和 GUI 支持敏感。运行前务必验证:
(1)Java 版本与位数
java -version # 必须输出类似: # openjdk version "11.0.22" 2024-01-16 # OpenJDK Runtime Environment (build 11.0.22+7-post-Ubuntu-0ubuntu2.22.04.1) # OpenJDK 64-Bit Server VM (build 11.0.22+7-post-Ubuntu-0ubuntu2.22.04.1, mixed mode, sharing)- 若显示
1.8.0_XXX,需升级 JDK; - 若为
ARM64(如 M1/M2 Mac),需确认libswt是否含aarch64子目录(PDI 9.4+ 已内置); - Windows 用户若用
java.exe但javaw.exe不在 PATH,Spoon 可能闪退——将 JDKbin/目录加入系统 PATH。
(2)内存分配(关键!默认 1G 不够用)
Spoon 启动脚本spoon.sh/spoon.bat默认-Xmx1024m,加载大型 transformation(>50 步)或启用调试模式时必然 OOM。修改方式:
Linux/macOS:编辑spoon.sh,找到OPT="$OPT -Xmx1024m"行,改为:
OPT="$OPT -Xmx4096m -XX:MaxMetaspaceSize=512m"Windows:编辑spoon.bat,找到set OPT=%OPT% -Xmx1024m,改为:
set OPT=%OPT% -Xmx4096m -XX:MaxMetaspaceSize=512m参数说明:
-Xmx4096m设堆上限为 4GB(建议 4–8GB,视机器总内存定);-XX:MaxMetaspaceSize防止动态类加载撑爆元空间(Spoon 加载插件时高频触发)。
(3)Linux GUI 依赖(kettle linux环境部署的核心拦路虎)
Headless Linux 服务器(如阿里云 ECS、腾讯云 CVM)默认无 X11 图形栈。若直接运行./spoon.sh,报错No more handles [gtk_init_check() failed]。Spoon 不能在纯命令行服务器上运行——它必须有 GUI 环境。正确做法分两类:
- ✅ 开发机/跳板机:用 X11 转发(SSH -X)或 VNC 连入桌面环境;
- ✅ 生产部署:Spoon 仅用于开发和测试,生产环境用 Pan/Kitchen/Carte 执行,不装 Spoon。这是 PDI 最佳实践,也是“linux环境部署kettle”的真实含义:部署的是执行引擎,不是图形界面。
2.3 首次运行 Spoon:绕过向导、直连本地、验证基础能力
双击spoon.sh(macOS/Linux)或spoon.bat(Windows),首次启动会弹出 Welcome 向导。跳过它(点右上角 ×),直接进入主界面。此时左上角菜单栏应完整显示:File、Edit、Tools、Execution、View、Help。验证三件事:
- 新建空白 transformation:
File → New → Transformation,画布出现,左侧“Core Objects”面板可拖出 “Input” → “Table Input”; - 连接本地 HSQLDB 示例库:
Tools → Repository → Connect,选 “Pentaho Repository”,Database Type 选 “HSQLDB (local)”,点击 “Test” 成功(默认端口 9001,无需额外启服务); - 运行最简流程:拖一个 “Generate Rows”(生成 10 行数据),连到 “Dummy”(空接收),右键画布 → “Run”,弹出 Execution Results 窗口,显示
Finished after 0.012s且Rows read: 10。
逻辑说明:HSQLDB 是 PDI 自带的嵌入式数据库,用于存储 repository 元数据(用户、权限、作业历史),非业务库。它证明 Spoon 的 JDBC 层、SWT 渲染、执行引擎三者已联通。若卡在 Test,检查
data/hsqldb/目录是否可写,或防火墙是否拦截 9001 端口。
3. Spoon 的核心工作流:从拖拽设计到导出可部署包的四步闭环
3.1 设计 transformation:以“读 MySQL → 清洗 → 写 PostgreSQL”为例的最小可行链路
我们构建一个真实场景:从 MySQL 读订单表,过滤金额 > 100 的记录,转换时间字段格式,写入 PostgreSQL。全程不写 SQL,全图形化。
步骤 1:定义数据库连接
- 右键 “Database connections” → “New”;
- Name 填
mysql_prod,Connection type 选MySQL; - Host name 填
192.168.1.100,Database name 填sales_db,Port number 填3306; - Username/Password 填对应账号;
- 关键操作:点击 “Test” 成功后,勾选 “Connect on startup”(否则每次用都要重连);
- 点击 “OK” 保存。
参数说明:
Connect on startup将连接信息缓存到~/.kettle/connections.xml(Linux/macOS)或%USERPROFILE%\.kettle\connections.xml(Windows),避免重复输入。此文件明文存密码,生产环境务必用 Kettle 密码加密工具处理(见 5.2 节)。
步骤 2:构建 transformation 主干
- 新建 transformation(
File → New → Transformation); - 从左侧 “Input” 拖出 “Table Input”,双击打开配置:
- Connection:选刚建的
mysql_prod; - SQL:粘贴
SELECT order_id, amount, create_time FROM orders WHERE create_time >= '2024-01-01'; - 勾选 “Execute for each row”(否),“Replace variables”(否);
- Connection:选刚建的
- 拖出 “Filter rows”,连 Table Input 输出箭头;双击配置:
- Condition:
amount > 100;
- Condition:
- 拖出 “Select values”,连 Filter rows 的 “true” 分支;双击配置:
- 在 “Fields” 标签页,Add → 输入
create_time,Type 选Date,Format 填yyyy-MM-dd HH:mm:ss;
- 在 “Fields” 标签页,Add → 输入
- 拖出 “Table Output”,连 Select values;双击配置:
- Connection:新建
pg_analytics(PostgreSQL 类型,Host192.168.1.101,DBdw); - Table name:填
fact_orders; - 勾选 “Truncate table before insert”(首次全量);
- 在 “Fields” 标签页,Mapping 中将
order_id→order_id,amount→amount,create_time→create_time。
- Connection:新建
步骤 3:运行与调试
- 按
Ctrl+R(或工具栏绿色三角),弹出 Execute window; - 勾选 “Show log on execution end”,点 “Launch”;
- 查看日志:若出现
Connecting to database [mysql_prod]... OK→Reading query...→Writing to table [fact_orders]... Done,即成功; - 若报
ERROR: relation "fact_orders" does not exist,说明 PostgreSQL 表未建——Spoon 不自动建表,需提前执行 DDL。
逻辑说明:Spoon 运行时,先用 JDBC 连 MySQL 执行 SELECT,将结果集加载到 JVM 内存(注意大数据量 OOM 风险),再逐行过滤、转换,最后批量 INSERT 到 PostgreSQL。整个过程单线程,适合中小规模(<100 万行)。超量需切分或改用 “Bulk Load” 步骤。
3.2 设计 job:用 job 编排多个 transformation,实现“失败重试 + 邮件告警”
transformation 处理数据流,job 处理控制流。例如:每天凌晨 2 点跑清洗,失败则重试 2 次,仍失败发邮件给运维。
步骤 1:新建 job
File → New → Job;- 从 “General” 拖出 “Start”,作为入口;
- 拖出 “Transformation”,连 Start;双击配置:
- Transformation file:浏览选择刚保存的
clean_orders.ktr; - “Execute for every input row”:否;
- Transformation file:浏览选择刚保存的
- 拖出 “Success”,连 Transformation 的 “Success” 分支;
- 拖出 “Failure”,连 Transformation 的 “Failure” 分支;
步骤 2:添加重试与告警
- 从 “General” 拖出 “Delay”,连 Failure;双击设 Delay time (seconds) =
300(5 分钟); - 拖出第二个 “Transformation”,连 Delay;配置同第一个,但勾选 “Copy previous result”(继承上一次失败的上下文);
- 拖出 “Success”,连第二个 Transformation 的 Success;
- 拖出 “Failure”,连第二个 Transformation 的 Failure;
- 从 “Scripting” 拖出 “Mail”,连最终 Failure;双击配置 SMTP:
- SMTP server:
smtp.exmail.qq.com; - Port:
465; - Username/Password:企业邮箱账号;
- To:
ops@company.com; - Subject:
[PDI ALERT] clean_orders.ktr failed 2 times; - Message:
Job failed at ${Internal.Job.StartTime};
- SMTP server:
步骤 3:保存并测试
File → Save as→clean_orders.kjb;- 右键画布 → “Run”,观察日志:若第一个 transformation 失败,会等 5 分钟后重试;两次都失败则发邮件(需网络通 SMTP)。
逻辑说明:Job 是 DAG(有向无环图),每个节点是原子操作(Transformation、Shell、Mail 等)。Spoon 仅负责编排和本地触发,真正的重试逻辑由 Kitchen 执行时解析 job XML 实现。Mail 步骤依赖
javax.mail,若报NoClassDefFoundError,说明lib/mail.jar缺失——PDI 9.4+ 已内置,旧版需手动补。
3.3 导出为可部署包:生成 .ktr/.kjb + 依赖清单,交付给 Pan/Kitchen
Spoon 的设计成果必须导出为标准文件,才能脱离图形界面运行。这不是“另存为”,而是“生成可执行包”。
导出 transformation(.ktr)
File → Export → Export transformation to file;- 选择路径,文件名自动带
.ktr后缀; - 勾选 “Include database connections”(否则 Pan 找不到 mysql_prod);
- 不勾选 “Include plugins”(插件已随 PDI 安装包存在,重复打包导致冲突);
- 点 “Export”。
导出 job(.kjb)
File → Export → Export job to file;- 同样勾选 “Include database connections”;
- 若 job 调用其他 job 或 ktr,勾选 “Include sub-jobs/transformation”(递归打包所有依赖);
- 点 “Export”。
生成依赖清单(关键!避免“kettle pdi下载”后部署失败)导出的.ktr/.kjb是 XML,不含 JDBC 驱动。生产环境需确保:
- MySQL:
mysql-connector-java-8.0.33.jar放入lib/目录; - PostgreSQL:
postgresql-42.6.0.jar放入lib/目录; - Oracle:
ojdbc8.jar(JDK 11+ 兼容版)放入lib/目录; - 验证命令:
ls lib/*jdbc*应列出对应 jar。
逻辑说明:PDI 的 classpath 由启动脚本硬编码为
lib/*,不读$CLASSPATH。因此驱动必须物理放在lib/下,不能靠-cp参数追加。这是“linux环境部署kettle”最常翻车点——开发者本地测试用 Spoon 内置驱动,导出后忘了同步 jar 到服务器lib/目录。
4. Spoon 使用避坑指南:5 条血泪经验,覆盖连接、编码、部署、调试四大高频雷区
4.1 现象:Spoon 启动后界面乱码(中文变方框)、日志中文显示为?
原因:Spoon 启动脚本未指定 UTF-8 字符集,JVM 默认用系统 locale(Linux 常为en_US.UTF-8,但某些 Docker 镜像为C)。
解决:修改spoon.sh,在java命令前加-Dfile.encoding=UTF-8:
# 找到这一行(约第 150 行) java $OPT "$STARTUP" "$@" # 改为 java -Dfile.encoding=UTF-8 $OPT "$STARTUP" "$@"Windows 同理,在spoon.bat的java命令前加-Dfile.encoding=UTF-8。重启生效。
4.2 现象:Table Input 步骤执行 SQL 报错Unknown column 'name' in 'field list',但 MySQL 客户端可查
原因:MySQL 5.7+ 默认开启sql_mode=STRICT_TRANS_TABLES,而 Kettle JDBC 驱动未显式设置useSSL=false&serverTimezone=UTC,导致时区/SSL 协商失败,返回元数据异常。
解决:编辑数据库连接,Advanced 选项卡中,在 “Custom connection URL” 填:
?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true注意:
allowPublicKeyRetrieval=true是 MySQL 8.0+ 必需参数,否则报Public Key Retrieval is not allowed。
4.3 现象:导出的.ktr在 Linux 服务器用 Pan 执行,报Unable to load step plugin 'TableOutput'
原因:Spoon 导出时勾选了 “Include plugins”,导致 XML 中写死插件路径为C:\pdi\plugins\...,Pan 在 Linux 解析时路径不存在。
解决:永远不要勾选 “Include plugins”。PDI 插件机制要求插件目录结构与安装包一致。正确做法是:确保服务器 PDI 版本与开发机完全一致(如都是 9.4.0.0-343),插件自动加载。
4.4 现象:Job 中调用 Shell 步骤执行python3 etl.py,本地成功,服务器报Command not found
原因:Spoon 的 Shell 步骤在 Pan/Kitchen 中执行时,使用的是sh(非bash),且PATH环境变量为最小集(不包含/usr/local/bin)。
解决:Shell 步骤中写绝对路径:
/usr/bin/python3 /opt/etl/scripts/etl.py或在脚本开头显式 source profile:
source /etc/profile; python3 /opt/etl/scripts/etl.py4.5 现象:Spoon 连接 PostgreSQL 报FATAL: no pg_hba.conf entry for host,但 psql 命令行可连
原因:Spoon 使用 JDBC 连接,而pg_hba.conf中未配置host类型规则(只配了local),或未允许对应 IP 段。
解决:登录 PostgreSQL 服务器,编辑/var/lib/pgsql/data/pg_hba.conf,添加:
host all all 192.168.1.0/24 md5然后sudo systemctl reload postgresql重载配置。切勿用trust认证,生产环境必须md5。
5. 进阶技巧:用 Spoon 的“远程调试”与“参数化”打通开发-测试-生产三环境
5.1 用变量实现环境隔离:一套 .ktr 文件,三套数据库连接
硬编码数据库地址是运维噩梦。Spoon 支持两级变量:环境变量(System)和Kettle 变量(Kettle)。我们用后者实现“一次设计,三地运行”。
步骤 1:定义变量
Tools → Edit the system information;- 切换到 “Variables” 标签页;
- Add 三行:
Name Value Type DB_HOST192.168.1.100Kettle DB_PORT3306Kettle DB_NAMEsales_devKettle
步骤 2:在数据库连接中引用
- 编辑
mysql_prod连接; - Host name 改为
${DB_HOST}; - Port number 改为
${DB_PORT}; - Database name 改为
${DB_NAME}; - Test 成功后保存。
步骤 3:导出时注入不同值
- 开发环境:运行 Pan 时传参:
./pan.sh -file=clean_orders.ktr -param:DB_HOST=192.168.1.100 -param:DB_NAME=sales_dev - 测试环境:
./pan.sh -file=clean_orders.ktr -param:DB_HOST=192.168.1.102 -param:DB_NAME=sales_test - 生产环境:写成 shell 脚本,从配置文件读取变量,避免密码明文出现在命令行。
逻辑说明:
${xxx}是 Kettle 的变量占位符,运行时由 Pan/Kitchen 解析替换。变量名区分大小写,DB_HOST与db_host是两个变量。所有变量值在日志中默认隐藏(除非显式开启 debug),保障密码安全。
5.2 Spoon 远程调试:当 Pan 报错看不懂,回 Spoon 本地复现并断点
Pan 报错如org.pentaho.di.core.exception.KettleStepException: Unexpected error,堆栈极短。此时需在 Spoon 中模拟 Pan 的执行上下文。
启用 Spoon 调试模式
- 关闭 Spoon;
- 编辑
spoon.sh,在java命令后加 JVM 参数:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000 - 启动 Spoon;
- 用 IDE(IntelliJ IDEA)新建 Remote JVM Debug 配置,Host
localhost,Port8000,点 Debug 连接。
在 Spoon 中复现问题
- 打开出问题的
.ktr; - 在关键步骤(如 Table Input)右键 → “Edit step” → “Advanced” 标签页,勾选 “Enable step debugging”;
- 运行 transformation,IDE 会停在
TableInput.processRow()方法入口; - 查看
rowSet内容、databaseMeta连接状态、sql字符串值——比 Pan 日志多 10 倍信息。
参数说明:
suspend=n表示 Spoon 启动不阻塞,address=*:8000允许任意 IP 连接(内网安全)。生产环境严禁开启此参数。
5.3 加密敏感信息:用 Encr 工具加密数据库密码,杜绝明文泄露
.ktr/.kjb文件中密码明文存储,Git 提交即泄露。PDI 自带Encr工具加密。
加密密码
- 终端进入 PDI 目录,执行:
./encr.sh -kettle "mySecretPass123" # 输出:Encrypted 2be98afc86aa7f2e4bb18bd63c99dbdde - 将加密串
2be98afc86aa7f2e4bb18bd63c99dbdde粘贴到数据库连接的 Password 字段; - 勾选 “Hide password”(界面上显示为
***)。
解密验证(仅限管理员)
./encr.sh -kettle -dec "2be98afc86aa7f2e4bb18bd63c99dbdde"
逻辑说明:
Encr使用 PDI 内置密钥(hardcoded),所有同版本 PDI 共享同一解密逻辑。因此加密串可在团队内安全传递,只要版本一致即可解密。切勿用第三方工具加密,PDI 无法识别。
我坚持一个习惯:所有交付给运维的.ktr/.kjb,必附一份deploy.md,里面写清三件事——(1)依赖 jar 清单及下载链接;(2)环境变量注入命令模板;(3)首次运行前必须执行的 SQL(建表、授权)。这样对方不用翻文档,3 分钟就能跑起来。Spoon 的价值不在“炫技”,而在把数据工程师的思考,固化成可审计、可复现、可交接的标准化资产。希望帮到你。
本文还有配套的精品资源,点击获取