简介:本资源为Kettle核心图形化ETL开发工具Spoon的完整本地部署包,面向数据工程师、ETL开发者及Java技术栈初学者,解决跨平台数据集成环境快速搭建与开箱即用问题。压缩包含2867个文件,主体为1586个jar(支撑Java运行时与PDI核心功能)、200个ktr(可直接运行的数据转换作业)、19个kjb(工作流调度脚本)、200+个bat/sh启动脚本(覆盖Windows/Linux/Unix多环境),辅以配置类cfg、properties、xml及日志、文档等,总大小938.86MB,结构完整、即解即用。已有3782人学习下载,资源包含全量GUI可执行组件、示例作业、系统级启动与环境配置脚本(如Spoon.bat、set-pentaho-env.bat、start.bat等),无需额外编译或依赖安装,可立即开展数据抽取、清洗、转换与调度实践,特别适合ETL入门实操、企业级数据管道原型验证及跨平台开发环境复现。
1. Spoon 是什么:一个能拖拽连线、不用写 SQL 就把数据库跑通的 ETL 图形化工作台
你刚接手一个数据同步任务:每天凌晨把 MySQL 订单库的增量数据,清洗后写进 PostgreSQL 报表库,中间还要过滤掉测试账号、补全用户地区字段、把金额单位从分转成元。如果用脚本硬写,得反复调试连接、手拼 SQL、处理空值、加重试逻辑——上线前一晚还在改正则表达式。而 Spoon(Kettle 的图形工具)干的就是这事:它不让你碰一行 Java 或 SQL,而是用「拖拽组件 + 连线配置」的方式,把整个 ETL 流程画出来。你拖一个「MySQL 输入」组件,连一根线到「字段选择」,再连到「值映射」,最后接「PostgreSQL 输出」,双击每个组件填个表名、字段名、条件,保存运行,流程就活了。这不是玩具——某高校实验室用它把 12 个异构系统(Oracle/SQL Server/Excel/CSV)的日志自动归集到 Hive,三年没改过主流程;某公司用它替代了原来 37 个 Shell 脚本组成的调度链。它适合三类人:DBA 想快速验证数据流转逻辑、BI 工程师要搭轻量级数仓管道、开发想绕过代码写法直接看数据怎么变。注意:Spoon 不是低代码平台,它背后仍是 Kettle 引擎在跑 Java 字节码;它也不是可视化 BI 工具,画完图不会自动生成报表——它只管「数据怎么搬、怎么洗、怎么验」。
2. 本地跑通 Spoon:Windows/macOS/Linux 三端最小安装与启动验证
Spoon 是 Kettle(现名 PDI,Pentaho Data Integration)的图形客户端,本质是一个 Java Swing 应用。它的安装不依赖系统服务或后台进程,解压即用,但必须满足 Java 环境前提。下面分三步走:确认 Java 版本、下载对应 PDI 包、验证 Spoon 启动成功。整个过程不改系统变量、不装服务、不配数据库,5 分钟内完成。
2.1 检查并锁定 Java 版本:为什么必须用 JDK 8 或 11?
Kettle 9.x 及之后版本(当前主流是 9.4 和 10.2)明确要求 JDK 8u202+ 或 JDK 11。用 JDK 17 会报UnsupportedClassVersionError;用 JRE(非 JDK)会缺tools.jar导致 Spoon 启动时卡在「Loading plugins…」无响应。验证命令:
java -version # 正确输出示例(JDK 11): # openjdk version "11.0.20" 2023-07-18 # OpenJDK Runtime Environment Temurin-11.0.20+8 (build 11.0.20+8) # OpenJDK 64-Bit Server VM Temurin-11.0.20+8 (build 11.0.20+8, mixed mode)提示:不要用
java -version看到「1.8.0_XXX」就以为是 JDK 8——有些旧版 JRE 也显示这个。真正判断方法是执行javac -version,有输出才是 JDK。若无输出,需重装 JDK(推荐 Eclipse Temurin 或 Amazon Corretto,开源免费且长期支持)。
2.2 下载与解压 PDI 安装包:避开官网跳转陷阱
Pentaho 官网已将 PDI 移至 Hitachi Vantara 旗下,直接搜「kettle pdi 下载」常被导到过期页面或商业版入口。最稳路径是 GitHub Release 页面:搜索pentaho/pentaho-kettle/releases,找最新稳定版(如pdi-ce-10.2.0.0-170)。注意三个关键点:
- 文件名含
ce(Community Edition),不是ee(Enterprise); - 后缀是
.zip(Windows)或.tar.gz(macOS/Linux),不是.dmg或.exe(那些是旧版或第三方打包); - 大小约 850–950 MB,明显小于 200 MB 的基本是阉割版或镜像错误。
下载后解压到无中文、无空格路径,例如:
- Windows:
C:\pdi\pdi-ce-10.2.0.0-170 - macOS:
/Users/xxx/Applications/pdi-ce-10.2.0.0-170 - Linux:
/opt/pdi/pdi-ce-10.2.0.0-170
注意:Linux 用户若用
sudo tar -xzf解压到/opt,后续运行 Spoon 需用同一用户(非 root)启动,否则插件目录权限错乱导致「No plugins found」警告。
2.3 启动 Spoon 并验证界面就绪:看到「新建转换」才算成功
进入解压目录,按系统执行对应脚本:
- Windows:双击
spoon.bat(不要右键「以管理员身份运行」,会因 UAC 权限弹窗阻塞 GUI 线程); - macOS:终端执行
./spoon.sh(首次运行可能提示「已损坏」,需在「系统设置 > 隐私与安全性」中点「仍要打开」); - Linux:终端执行
./spoon.sh(确保文件有执行权限:chmod +x spoon.sh)。
等待 15–30 秒(首次启动加载插件较慢),出现主窗口即成功:顶部菜单栏完整(File / Edit / Tools / View / Help),左侧「视图」面板有「核心对象」「转换」「作业」三标签,右下角状态栏显示Ready。此时点击File → New → Transformation,弹出空白画布,拖一个「生成记录」组件放上去——说明 Spoon 已完全就绪。
逻辑说明:
spoon.sh/spoon.bat本质是调用java -Xmx2048m -XX:MaxMetaspaceSize=512m -jar launcher.jar启动,其中-Xmx2048m是堆内存上限,若机器内存 < 4GB,可临时改为-Xmx1024m避免 OOM;launcher.jar会自动读取plugins/目录加载所有组件,所以解压完整性直接影响功能可用性。
3. 用 Spoon 建第一个转换:从 CSV 读数据 → 清洗 → 写入 Excel(零 SQL 实操)
本节带你建一个真实可用的转换:读取sales.csv(含id,name,amount,region四列),过滤掉amount < 0的脏数据,把region中的「北上广」统一转为「一线城市」,最后导出到cleaned_sales.xlsx。全程不写 SQL,只靠组件连线和双击配置。这是 Spoon 最典型的使用模式,也是后续复杂流程的原子单元。
3.1 创建转换并添加「CSV 文件输入」组件
启动 Spoon 后,File → New → Transformation新建空白转换。从左侧面板「核心对象」→「输入」里,拖一个「CSV 文件输入」组件到画布中央。双击打开配置窗口:
- 文件:点击「浏览」选中你的
sales.csv(路径建议用绝对路径,如C:/data/sales.csv,避免相对路径在不同机器失效); - 内容:勾选「首行包含字段名称」;「分隔符」填
,;「封装符」填"(适配带逗号的文本字段); - 字段:点击「获取字段」按钮,自动读取 CSV 头行生成字段列表(
id,name,amount,region),类型默认为 String,无需修改。
参数说明:「获取字段」按钮必须点!否则字段列表为空,后续组件无法识别列名;若 CSV 无表头,需手动在「字段」页签逐行添加,类型选
Integer/Number/String对应数值精度。
3.2 接入「过滤记录」和「值映射」组件完成清洗
从「核心对象」→「转换」拖一个「过滤记录」组件,连一条线从「CSV 文件输入」指向它(鼠标悬停组件边缘出现小圆点,按住左键拖线到目标组件边缘)。双击「过滤记录」:
- 条件:点击「新建」→「字段」选
amount→「操作符」选<→「值」填0; - 发送至:下方两个输出分支,「true」分支留空(丢弃负数),「false」分支填
valid_data(作为下一步输入流名)。
再拖一个「值映射」组件,连线从「过滤记录」的valid_data分支指向它。双击配置:
- 字段:选
region; - 映射:点击「新增」三次,分别填:
value:北京,target:一线城市value:上海,target:一线城市value:广州,target:一线城市
- 其余
region值保持原样(不勾选「仅匹配项」,否则非北上广数据会被置空)。
逻辑说明:Spoon 中「连线」代表数据流方向,不是控制流;「过滤记录」组件本质是分流器,true/false 是布尔判断结果,不是成功/失败;「值映射」不改变字段名,只改值内容,下游组件仍认
region字段。
3.3 添加「Excel 输出」组件并运行验证
从「核心对象」→「输出」拖「Excel 输出」组件,连线从「值映射」指向它。双击配置:
- 文件:填输出路径,如
C:/output/cleaned_sales.xlsx; - 内容:「工作表名称」填
Sheet1;「包含列标题」打钩; - 字段:点击「获取字段」,自动列出
id,name,amount,region四字段,顺序与 CSV 一致,无需调整。
全部连好后,点击工具栏绿色三角形「运行」按钮。弹出「执行转换」窗口,点「执行」。底部日志面板显示:
INFO [org.pentaho.di.trans.Trans] - Transformation opened. INFO [org.pentaho.di.trans.Trans] - Dispatching started for transformation [Transformation] INFO [org.pentaho.di.trans.step.StepMeta] - CSV file input.0 - Finished processing (I=1234, O=0, R=0, W=1234, U=0, E=0) ... INFO [org.pentaho.di.trans.Trans] - Transformation finished!检查C:/output/cleaned_sales.xlsx是否生成,用 Excel 打开确认:行数比原 CSV 少(负数被过滤),region列中北京/上海/广州已变为「一线城市」。
提示:若运行失败,先看日志末尾红色
ERROR行;常见原因是路径不存在(C:/output/目录需手动创建)、Excel 文件被其他程序占用(关掉 Excel 再试)、字段名大小写不一致(Spoon 默认区分大小写,CSV 头是AMOUNT但组件里写amount就报错)。
4. Spoon 常见问题排查:5 个血泪经验换来的必踩坑清单
Spoon 界面友好,但底层是 Java 应用,环境、权限、路径稍有偏差就会静默失败或行为诡异。以下 5 条是某跨平台系统部署时真实翻车记录,按「现象 → 原因 → 解决」结构整理,覆盖 90% 新手卡点。
4.1 现象:Spoon 启动后黑屏/白屏/卡在「Loading plugins…」,无报错日志
原因:Java 版本不兼容(如用 JDK 17)或缺少tools.jar(用了 JRE 而非 JDK);或spoon.sh脚本中JAVA_HOME被硬编码为旧路径。
解决:
- 终端执行
which java和readlink -f $(which java)确认实际 JDK 路径; - 编辑
spoon.sh,找到JAVA_HOME=行,注释掉(前面加#),让脚本自动探测; - 若仍不行,在
spoon.sh第二行插入export JAVA_HOME=/path/to/your/jdk11(macOS/Linux)或修改spoon.bat中set JAVA_HOME=(Windows)。
4.2 现象:转换运行时报Unable to load database connection info,但数据库连接测试通过
原因:Spoon 中「数据库连接」配置保存在~/.kettle/目录下的repositories.xml或database_connections.xml,但该目录被其他用户或旧版本污染,导致连接信息读取错乱。
解决:
- 关闭 Spoon;
- 备份后删除
~/.kettle/整个目录(Windows 是%USERPROFILE%\.kettle\); - 重启 Spoon,重新配置数据库连接(此时会重建干净的配置文件)。
4.3 现象:「Excel 输出」组件生成的.xlsx文件打不开,提示「文件格式损坏」
原因:Apache POI 插件缺失或版本冲突。PDI 10.x 默认带poi-5.2.4.jar,但若手动复制过旧版poi-3.x.jar到lib/目录,会因类加载顺序导致XSSFWorkbook初始化失败。
解决:
- 进入
pdi-ce-xx/lib/目录; - 执行
ls -la poi*,确认只有poi-5.2.4.jar、poi-ooxml-5.2.4.jar等 5.x 版本; - 删除所有
poi-3.*.jar、poi-4.*.jar; - 重启 Spoon。
4.4 现象:中文字段名在「CSV 输入」中显示为乱码(如??),但文件用记事本打开正常
原因:CSV 文件编码不是 UTF-8(常见为 GBK/GB2312),而 Spoon 默认按 UTF-8 解码。
解决:
- 在「CSV 文件输入」配置窗口 →「内容」页签 →「编码」下拉框,选
GBK或GB2312; - 更可靠做法:用 VS Code 或 Notepad++ 将 CSV 文件另存为 UTF-8 编码(带 BOM),再用 Spoon 读取。
4.5 现象:转换中「JavaScript 代码」组件报ReferenceError: "row" is not defined
原因:Spoon 9.x+ 默认禁用 Nashorn 引擎(JDK 11+ 已移除),而旧脚本习惯用row['field']访问字段,新引擎要求用getInputRowMeta().getString(row, "field")。
解决:
- 改用「用户定义 Java 类」组件(更稳定,支持完整 Java 语法);
- 或在「JavaScript 代码」中改写为:
var amount = getInputRowMeta().getNumber(row, "amount"); if (amount < 0) { setOutputRowSet(null); // 丢弃此行 }
5. 生产就绪技巧:用 Carte 服务化 Spoon 转换 + 日志分级落盘
Spoon 本地调试方便,但生产环境不能靠人工双击运行。必须把转换变成可调度、可监控、可回溯的服务。核心方案是:用 Carte(Kettle 自带的轻量 Web 服务)托管转换,通过 REST API 触发,并将日志按级别分离存储。这步做完,你的 Spoon 流程才算真正落地。
5.1 启动 Carte 服务并部署转换
Carte 是 Kettle 的 Web 服务模块,解压即用,无需额外安装。进入 PDI 解压目录,执行:
- Windows:
carte.bat - macOS/Linux:
./carte.sh
默认监听http://localhost:8080,访问该地址看到Carte server running...即成功。接着部署转换:
- 在 Spoon 中打开你的转换(如
sales_clean.ktr); File → Export → Export to Carte;- 填 Carte 地址
http://localhost:8080,用户名cluster,密码cluster(默认凭据); - 点「确定」,Spoon 自动上传转换到 Carte 的
transformations/目录。
逻辑说明:Carte 本质是 Jetty Web Server + Kettle Engine,上传的
.ktr文件被 Carte 加载为内存中的转换实例,REST API 调用时直接触发执行,不依赖 Spoon GUI 进程。
5.2 用 curl 触发转换并解析返回 JSON
Carte 提供标准 REST 接口。假设转换名为sales_clean,执行命令:
curl -X POST "http://localhost:8080/kettle/executeTrans/?trans=sales_clean" \ -H "Content-Type: application/json" \ -d '{"param1":"value1"}' \ -u cluster:cluster成功返回:
{ "status": "OK", "id": "trans-1234567890", "message": "Started execution of transformation [sales_clean]" }用 ID 查询状态:
curl "http://localhost:8080/kettle/transStatus/?id=trans-1234567890" -u cluster:cluster返回含status: "Finished"和logging_string(截断日志)的 JSON。
参数说明:
-u cluster:cluster是 Basic Auth 凭据;param1是转换中定义的命名参数(在 Spoon 中Edit → Transformation settings → Parameters添加),用于动态传参,如--date=20231001。
5.3 配置日志分级:让 ERROR 写文件,INFO 写控制台
Carte 默认日志混在一起,生产环境需分离。编辑carte.sh(或carte.bat),在java命令后添加 JVM 参数:
-Dorg.apache.log4j.config=log4j2.xml然后在 PDI 根目录创建log4j2.xml,内容如下(精简版):
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <File name="ErrorFile" fileName="logs/carte-error.log"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <Filters> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </File> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <Filters> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </Console> </Appenders> <Loggers> <Root level="ALL"> <AppenderRef ref="ErrorFile"/> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>重启 Carte 后,logs/carte-error.log只存 ERROR 级别日志(便于告警),控制台只刷 INFO 级(便于实时观察进度)。
5.4 我的生产习惯:用 shell 脚本封装 Carte 调用 + 失败自动重试
我一般不裸写 curl,而是封装成可调度脚本。例如run_sales.sh:
#!/bin/bash TRANS_NAME="sales_clean" CARTE_URL="http://localhost:8080" MAX_RETRY=3 for i in $(seq 1 $MAX_RETRY); do echo "Attempt $i to run $TRANS_NAME..." RESPONSE=$(curl -s -X POST "$CARTE_URL/kettle/executeTrans/?trans=$TRANS_NAME" \ -u cluster:cluster -H "Content-Type: application/json" -d '{}') if echo "$RESPONSE" | grep -q '"status":"OK"'; then echo "Success! ID: $(echo $RESPONSE | jq -r '.id')" exit 0 else echo "Failed: $RESPONSE" sleep 10 fi done echo "All $MAX_RETRY attempts failed." >&2 exit 1配合 crontab 每日凌晨 2 点执行:
0 2 * * * /opt/pdi/run_sales.sh >> /var/log/sales-cron.log 2>&1这样既保留 Carte 的服务化能力,又获得 Shell 的灵活控制——比如失败后发钉钉通知、清理临时文件、更新监控指标。
Spoon 的价值不在炫技,而在把数据工程师从「写 SQL → 改 SQL → 调 SQL → 查 SQL 错误」的循环里解放出来,用可视化方式聚焦业务逻辑本身。我见过太多团队前期用脚本硬扛,等数据源涨到 20+ 个才回头补 Spoon,结果重构耗时两周。早一天画清数据流向,就少一天在日志里 grep 错误。希望帮到你。
本文还有配套的精品资源,点击获取