简介:这份资源是Kettle(Pentaho Data Integration)图形化工具Spoon的完整安装包,面向数据工程师、ETL开发者及数据分析人员,帮助在无需编写代码的前提下完成数据抽取、清洗、转换与加载任务。压缩包共2867个文件,约938.86MB,以1586个jar核心库、200个ktr转换示例、19个kjb作业文件为主,辅以xml配置、properties参数、bat与sh启动脚本、png图标及readme说明,覆盖Windows、Linux、Unix多平台运行所需组件。目前已有3782人学习下载。借助Spoon可视化界面,读者可通过拖放步骤构建数据转换与工作流,连接数据库、文件系统、Web服务等多种数据源,处理CSV、Excel、XML、JSON等格式,并利用调试日志、单步执行与CRON定时调度功能排查问题、实现自动化批处理。包内附带的示例转换与作业文件,便于快速理解步骤连接逻辑与插件扩展方式,适合作为企业级数据整合项目的实践参考。
1. Spoon 到底是个什么东西:从一次数据抽取翻车说起
如果你第一次接触 Kettle,大概率是被一个 Excel 或者 CSV 的清洗需求逼过来的。业务方丢来一个几十万行的表格,让你按规则拆分、去重、关联数据库再导回去,用 Python 写脚本当然可以,但改一版就要重跑一次,字段一变就得重调代码。这时候有人告诉你,有个叫 Kettle 的工具,图形化拖拽就能干完,那个图形化界面就是 Spoon。
Kettle 现在的正式名字叫 PDI(Pentaho Data Integration),Spoon 是它桌面端的图形设计器,负责画转换(Transformation)和作业(Job)。转换管数据流,作业管流程调度,两者都存成 XML 文件,Spoon 只是编辑器,真正跑起来靠的是 Carte、Pan 或者 Kitchen 这些命令行组件。理解这一点很关键:Spoon 不是运行时,它只是把你想干的事翻译成一份可执行的配置。所以「kettle 如何使用」这个问题,本质上是「怎么用 Spoon 把数据流画对,再交给引擎跑」。
这篇笔记面向三类人:刚下载完 Kettle 不知道怎么下手的新手、被字段映射和驱动问题折磨过的老手、以及想把 Spoon 画的流程接进自动化调度的工程师。我会从安装、画第一个转换、参数配置、驱动踩坑一路讲到怎么验证结果,尽量把每一步的命令和参数都写清楚,让你照着能复现。
2. 装好 Spoon 并跑通第一个转换:从下载到出结果
2.1 下载、解压与启动前的环境准备
Kettle 是绿色包,官网下载下来是一个压缩包,解压就能用,不需要安装程序。但「解压就能用」有个前提:本机得有 Java 运行环境。Kettle 8 以后对 JDK 版本有要求,常见做法是装 JDK 8 或 JDK 11,装完把JAVA_HOME配好,spoon.bat(Windows)或spoon.sh(Linux/Mac)才能正常拉起界面。
启动脚本里其实做了两件事:找 Java、把lib目录下的 jar 全部塞进 classpath。所以如果你改了 JDK 版本,最稳妥的方式是直接改spoon.bat里那行set JAVA_HOME,而不是依赖系统环境变量,避免多版本 JDK 打架。
# Windows 下启动 Spoon,双击 spoon.bat 即可 # Linux / Mac 下需要先给脚本执行权限 chmod +x spoon.sh ./spoon.sh启动后如果界面卡在 splash 不动,八成是 JDK 版本不匹配或者内存不够。可以在spoon.bat里找到PENTAHO_DI_JAVA_OPTIONS,把-Xmx调大一点,比如-Xmx2048m。这个参数控制 Spoon 自身占用的堆内存,跟后面数据抽取时的内存是两回事,别搞混。
2.2 新建转换、拖控件、连线的最小闭环
Spoon 里有两个核心概念:转换(Transformation,.ktr文件)和作业(Job,.kjt文件)。转换是数据从输入到输出的管道,作业是控制转换什么时候跑、跑失败了怎么办。新手先画转换。
一个最小可跑的转换只需要三个控件:一个输入(比如「CSV 输入」)、一个处理(比如「字段选择」)、一个输出(比如「文本文件输出」)。在左侧「核心对象」树里找到它们,拖到画布上,按住 Shift 从上一个控件拖到下一个控件,就连成了一条线。这条线叫跳(Hop),数据就是沿着跳流动的。
画完之后点工具栏的「预览」或者按 F8 跑一次,Spoon 会在下方弹出执行结果面板,显示每一步读了多少行、写了多少行、耗时多少。这个面板是排查问题的第一现场,后面所有踩坑基本都从这里看起。
2.3 用 CSV 输入 + 字段选择 + 文本输出跑通一次数据抽取
下面这个转换做的事情是:读一个 CSV,把其中两列改名并去掉多余空格,再写成一个新的文本文件。这是「kettle 数据抽取」最常见的入门形态。
转换结构(在 Spoon 画布上连线): CSV输入 --> 字段选择 --> 文本文件输出CSV 输入控件的关键配置:
| 配置项 | 说明 | 常见取值 |
|---|---|---|
| 文件名 | 要读的 CSV 路径 | 支持变量${INPUT_FILE} |
| 分隔符 | 列之间的分隔符 | 逗号、分号、制表符 |
| 编码 | 文件字符集 | UTF-8、GBK |
| 包含列名 | 首行是否为表头 | 是 / 否 |
| 字段类型 | 每列的数据类型 | String、Integer、Number、Date |
字段选择控件里做两件事:在「选择和修改」页把需要的列勾上,在「元数据」页改列名和类型。文本文件输出里指定输出路径、分隔符、是否追加。跑通之后你会看到输出文件里就是清洗后的数据。
这里有个容易忽略的点:CSV 输入里的「字段类型」如果设成 Integer,但实际数据里有空值或者非数字,这一步就会报错或者把整行丢掉。稳妥做法是先全部按 String 读进来,在字段选择里再转类型,这样出错时能定位到具体是哪一行。
3. 参数、变量与数据库连接:让转换能复用、能连库
3.1 用参数和变量把路径、表名抽出来
写死路径的转换没有复用价值。Spoon 支持两种动态值:参数(Parameter)和变量(Variable)。参数在转换属性里定义,运行时必须传值;变量可以从kettle.properties读,也可以在作业里用「设置变量」控件动态赋值。
常见做法是把输入输出路径、数据库连接名、批次日期都做成参数,转换里用${参数名}引用。这样同一份.ktr文件,换个参数就能跑不同批次的数据。
在转换属性 -> 参数 里定义: INPUT_FILE = /data/input/20240101.csv OUTPUT_FILE = /data/output/20240101.txt BATCH_DATE = 20240101引用的时候直接写${INPUT_FILE}。注意参数名大小写敏感,写错了不会报错,只会把字面量当成路径,然后报「文件不存在」,这种问题排查起来很费时间。
3.2 配置数据库连接与 JDBC 驱动放置位置
连数据库是 Kettle 的重头戏。在 Spoon 里新建一个数据库连接,选好数据库类型,填主机、端口、库名、用户名密码,点「测试」能通才算配好。但「测试」通过不代表转换里一定能用,因为驱动 jar 的加载时机和连接测试不完全一样。
驱动 jar 要放到lib目录下,重启 Spoon 才会生效。MySQL 用mysql-connector-java,Oracle 用ojdbc,SQL Server 用mssql-jdbc。放错位置或者版本不匹配,典型报错是No suitable driver found或者ClassNotFoundException。
# 驱动统一放这里,重启 Spoon 生效 kettle/lib/mysql-connector-java-8.0.xx.jar kettle/lib/ojdbc8.jar3.3 用 ucanaccess 驱动读写 Access 数据库
「kettle ucanaccess 驱动」是搜索里高频出现的问题,因为 Access 的.mdb/.accdb文件不能直接用 JDBC 连,得靠 UCanAccess 这个纯 Java 驱动。做法是把 UCanAccess 相关的几个 jar 一起放进lib:ucanaccess、jackcess、commons-lang、commons-logging、hsqldb。少一个都会报错。
连接字符串的写法跟普通 JDBC 不一样:
连接类型:Generic database 自定义连接 URL: jdbc:ucanaccess:///data/db/test.accdb;memory=false 驱动类名: net.ucanaccess.jdbc.UcanaccessDrivermemory=false这个参数建议加上,否则 UCanAccess 会把整个库加载进内存,大文件直接 OOM。这是血泪经验,Access 文件超过几百兆的时候不加这个参数,Spoon 会卡死。
4. 在 Spoon 里写 JavaScript 和调度作业:把流程串起来
4.1 JavaScript 步骤的输入输出行结构
「kettle 中 javascript 代码」也是常见需求,因为有些清洗逻辑用控件拼太啰嗦,写几行脚本更快。Spoon 里的「JavaScript 代码」步骤用的是 Rhino 引擎,不是 Node,语法是 ES5 那一套,别用let、箭头函数、模板字符串。
这个步骤的输入是上一跳传来的行,输出是脚本里_step_对象处理过的行。每一行通过row数组访问字段,字段名对应列名。
// 假设上游有 name 和 amount 两列 // 去掉 name 前后空格,amount 为空时置 0 var name = row[name_index]; var amount = row[amount_index]; if (name != null) { name = name.trim(); } if (amount == null || amount == '') { amount = 0; } // 写回行对象 row[name_index] = name; row[amount_index] = amount; // 把行传给下一步 trans_Status = CONTINUE;name_index和amount_index是脚本步骤里自动生成的字段索引变量,不用自己定义。trans_Status控制这行是继续往下走(CONTINUE)、跳过(SKIP_TRANSFORMATION)还是报错(ERROR_TRANSFORMATION)。这个变量不设,默认就是 CONTINUE,但显式写出来更清楚。
4.2 作业里调度转换与失败重试
作业(Job)用来编排多个转换的执行顺序。常见结构是:先「设置变量」把批次日期算出来,再「转换」调用具体的.ktr,后面接「成功」和「失败」两条分支。失败分支可以接一个「发送邮件」或者「写日志表」,也可以接「等待」再重试。
作业里的「转换」控件要指定.ktr文件路径,并且把参数传进去。参数传递在「转换」控件的「参数」页配置,名字要和转换里定义的参数一致。如果转换里用了${BATCH_DATE}但作业没传,运行时就会报变量未定义。
调度频率高、数据量大的场景,建议把作业做成.kjb文件,用kitchen.sh命令行跑,而不是一直开着 Spoon 点运行。Spoon 是设计器,长时间跑任务容易内存泄漏。
# 命令行执行作业,适合放进 crontab ./kitchen.sh -file=/data/job/daily_load.kjb -level=Basic-level控制日志级别,Basic 只打关键信息,Debug 会打每一行的处理细节,排查问题时才开,平时开 Debug 日志文件会爆炸。
5. 避坑与排查:Spoon 里最容易翻车的五个地方
5.1 中文乱码:现象是输出文件里中文变问号
现象:CSV 读进来中文正常,写到文本文件或者数据库后变成???或者乱码。原因通常是输入、输出、数据库连接三处的字符集不一致。CSV 输入里设了 UTF-8,但文本文件输出默认用的是系统编码,Windows 下就是 GBK。解决方式是把输出控件的编码也显式设成 UTF-8,数据库连接 URL 里加上characterEncoding=utf8。三处对齐之后乱码基本消失。
5.2 驱动报错:现象是测试连接通过但转换里报 No suitable driver
现象:在数据库连接界面点「测试」是成功的,但转换一跑就报No suitable driver found。原因是 Spoon 的连接测试用的是它自己加载的驱动,而转换执行时用的是另一套类加载器。解决方式是把驱动 jar 同时放到lib和libext目录下,重启 Spoon。如果还不行,检查驱动版本和数据库版本是否匹配,MySQL 8 要用 8.x 的驱动,用 5.x 的驱动连 8 的库会报认证错误。
5.3 内存溢出:现象是跑大文件时 Spoon 卡死或报 OutOfMemoryError
现象:处理几十万行以上的数据时,Spoon 界面无响应,日志里出现OutOfMemoryError: Java heap space。原因是 Spoon 默认堆内存偏小,而且有些步骤(比如排序、聚合)会把数据缓存在内存里。解决方式是改spoon.bat里的-Xmx,调到 2048m 或更高;同时检查转换里有没有不必要的排序步骤,能去掉就去掉。Access 数据库记得加memory=false。
5.4 字段类型不匹配:现象是数字列读进来变成科学计数法或丢精度
现象:CSV 里是1234567890123这样的长数字,读进来变成1.23457E+12。原因是字段类型设成了 Number,而 Number 底层是双精度浮点,超过 15 位就丢精度。解决方式是把这类列设成 String 或者 BigInteger,如果确实要参与计算,用 BigDecimal 类型。金额字段尤其要注意,用 Number 算出来的结果可能差几分钱。
5.5 转换跑得慢:现象是单步耗时正常但整体吞吐低
现象:每一步单独看都不慢,但整个转换跑起来吞吐量很低。常见原因是跳(Hop)的复制/分发设置不对。默认情况下跳是「复制」模式,数据会被复制到所有下游步骤,如果下游有多个,等于每行被处理多次。如果本意是分流,应该改成「分发」模式。另外,数据库输出步骤的「提交记录数量」默认是 1000,调大到 5000 或 10000 能明显提升写入速度,但事务回滚的粒度也会变大,要权衡。
6. 进阶技巧:用 Carte 做远程执行和结果验证
Spoon 画好的转换,最终是要脱离界面跑的。除了前面说的kitchen.sh跑作业,还有一个更灵活的方式是 Carte。Carte 是一个轻量级的 Web 服务,启动后可以接收远程提交的转换和作业,适合把 Kettle 集成进已有的调度系统。
启动 Carte 的命令很简单:
# 启动 Carte 服务,默认端口 8080 ./carte.sh 0.0.0.0 8080启动后访问http://主机:8080能看到一个简单的管理界面。转换可以通过 HTTP 接口提交执行,也可以把.ktr文件放到 Carte 的配置目录里,用carte.sh的配置文件指定。这种方式的好处是转换在服务端跑,Spoon 只负责设计,设计和执行分离,团队协作时不会因为某个人关了电脑导致任务中断。
验证结果这块,我一般会做两件事。第一是在转换末尾加一个「写日志」步骤,把关键字段和行数打到日志里,跑完直接看日志确认行数对不对。第二是用「字段选择」把输出结果的前 100 行采样出来,跟源数据做比对。不要只看「执行成功」就完事,Kettle 的「成功」只代表没抛异常,不代表数据是对的。有一次我跑一个关联查询,因为连接条件写错,输出行数比预期多了三倍,但转换状态是成功的,差点把错误数据推到下游。
还有一个习惯是给每个转换加一个「获取系统信息」步骤,把当前时间、主机名、转换文件名写进每一行。这样数据出了问题,能追溯到是哪台机器、哪个时间点、哪个版本的转换跑出来的。这个习惯帮我省过很多次扯皮的时间。
Spoon 这个工具,入门门槛不高,但要用稳,靠的是对参数、驱动、字符集、内存这几件事的敬畏。我踩过的坑基本都写在上面了,希望帮到你。
本文还有配套的精品资源,点击获取