ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kettle Spoon 入门指南:从安装到 ETL 转换实战与避坑

Kettle Spoon 入门指南:从安装到 ETL 转换实战与避坑 简介这份资源是KettlePentaho 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定时调度功能排查问题、实现自动化批处理。资源还包含插件扩展与集群部署相关文件适合从入门到进阶的ETL实践者系统学习与项目落地。1. Kettle 的 Spoon 到底解决什么问题从一次凌晨三点的数据对不上说起凌晨三点业务方在群里甩来一张截图订单表比财务系统多了 127 条记录。你打开数据库客户端写了两条 SQL 对比发现差异来自一张中间表——上游推送的 CSV 里混进了空行和 BOM 头。这种场景下写 Python 脚本当然能解决但下次换成 Excel 对账、再下次换成两个库之间的字段映射脚本就越堆越多最后没人敢动。Kettle 的图形工具 Spoon 就是为这类「数据抽取、转换、装载」的重复劳动准备的它把数据源、转换步骤、目标表画成一张可执行的流程图你拖控件、连线、配参数点运行就能跑。Spoon 是 Pentaho Data IntegrationPDI的桌面客户端Kettle 是这套工具的老名字现在社区里两个叫法混着用。它适合谁适合需要频繁做库间同步、文件清洗、定时 ETL 但又不想每次都写脚本的工程师也适合刚接触数据集成、想先用可视化把流程跑通再考虑代码化的新手。这一章不展开操作先把「为什么值得用 Spoon」这件事说清楚。2. Spoon 的安装与第一个转换从下载到跑通 CSV 入库2.1 下载安装别在官网迷路认准 PDI 包Kettle 现在归 Pentaho 社区版维护搜索「kettle 下载」或「kettle pdi 下载」时排在前面的往往是第三方搬运站。稳妥做法是去 Pentaho 社区下载页找PDI (Pentaho Data Integration)的 CE 版本。下载下来是一个压缩包解压后目录里会有Spoon.batWindows和Spoon.shLinux/macOS。不需要安装但需要 Java 运行环境——这是第一个硬门槛。# 检查 Java 版本Spoon 对 JDK 有要求 java -version # 如果输出不是 1.8 或 11 这类 LTS 版本先装 JDK # Linux 下用包管理器装 OpenJDK 11 sudo apt install openjdk-11-jdk # 解压 PDI 包以实际下载的文件名为准 unzip pdi-ce-*.zip -d /opt/pdi # 进入目录给脚本执行权限 cd /opt/pdi/data-integration chmod x spoon.sh # 启动 Spoon ./spoon.sh逻辑说明Spoon 本身是 Java 写的启动脚本会去调java命令。如果系统里装了多个 Java 版本Spoon 可能挑到不兼容的那个表现是启动闪退或报UnsupportedClassVersionError。参数上spoon.sh支持通过-Xmx传 JVM 内存比如./spoon.sh -Xmx2048m处理大文件时默认内存不够会 OOM。提示Windows 下如果双击Spoon.bat一闪而过先在 cmd 里执行它看报错信息多半是 Java 路径没配好。2.2 第一个转换CSV 文件到数据库表打开 Spoon 后新建「转换」Transformation左侧核心对象树里拖两个控件CSV 文件输入和表输出。用鼠标把前者连到后者形成一条线。双击 CSV 输入配置文件名、分隔符、编码双击表输出配置数据库连接和目标表。点运行看下方执行结果面板的步骤度量。转换结构示意非代码描述连线关系 [CSV 文件输入] --- [表输出] | | 读文件字段 写数据库行配置 CSV 输入时几个参数容易翻车参数常见值说明分隔符,或\t中文 CSV 常带逗号在引号内需勾选「包含列名」并处理引号编码UTF-8 / GBK不匹配时中文变乱码看预览就能发现字段类型String / Integer / Number类型猜错会导致入库失败或精度丢失空行处理跳过空行不勾选时空行会变成全 null 记录插进去表输出这边数据库连接需要填 JDBC URL、用户名、密码。MySQL 的 URL 形如jdbc:mysql://host:3306/db?useUnicodetruecharacterEncodingutf8。如果目标表不存在可以勾选「指定数据库字段」并让 Spoon 生成建表语句但生产环境我一般手动建表避免字段类型被 Spoon 猜错。2.3 运行与看日志别只看「运行成功」点运行后Spoon 底部会弹出执行结果窗口里面有「步骤度量」和「日志」。步骤度量告诉你每个步骤读了多少行、写了多少行、耗时多少。如果 CSV 输入显示读了 1000 行表输出只写了 998 行那 2 行就是被过滤或出错了。日志里会打ERROR或WARNING比如字段截断、主键冲突。执行结果面板关键列 - 步骤名称CSV 文件输入 / 表输出 - 读入行数1000 - 写出行数998 - 错误行数2 - 耗时0.5s看到错误行数不为 0不要直接重跑。先点「日志」标签找Caused by后面的具体原因。常见的是目标表字段长度不够比如源数据里有个 200 字符的备注目标表只给了 varchar(100)。3. 转换里的核心控件与参数字段选择、JavaScript、条件路由3.1 字段选择改名、改类型、去字段都在这里CSV 读进来的字段名可能是col1、col2入库前要改成业务字段名。字段选择控件做三件事改名、改类型、移除不需要的字段。双击后在「元和数据类型」标签里把col1改成order_id类型从 String 改成 Integer。如果某个字段不需要在「移除」标签里勾选。字段选择配置示例 - 元数据col1 - order_id (Integer) - 元数据col2 - amount (Number, 精度 2) - 移除col3, col4参数说明改类型时如果源数据里有非数字字符转换会报错。稳妥做法是先保持 String在后续步骤里用 JavaScript 做清洗和校验确认干净了再转类型。字段选择本身不产生新行只改元数据所以它不会影响行数。3.2 JavaScript 代码轻量清洗和计算字段热搜里「kettle 中 javascript 代码」出现频率很高因为很多清洗逻辑用 JavaScript 写比拖控件快。在转换里加一个JavaScript 代码控件它有一个script标签页里面写代码通过字段名直接访问输入行字段用trans_Status控制行是否继续。// 清洗金额字段去掉货币符号转成数字 var raw amount_str; if (raw ! null) { // 去掉 ¥ 和逗号 raw raw.replace(/[¥,]/g, ); // 转成浮点数 var num parseFloat(raw); if (!isNaN(num)) { amount num; } else { // 解析失败标记并跳过该行 trans_Status SKIP_TRANSFORMATION; } } else { trans_Status SKIP_TRANSFORMATION; }逻辑说明amount_str是输入字段amount是输出字段需要在 JavaScript 控件的「字段」标签里先声明。trans_Status SKIP_TRANSFORMATION会让当前行不再往下走相当于过滤掉。参数上JavaScript 控件默认用 Rhino 引擎不支持 ES6 的let、const和箭头函数写var最稳。注意JavaScript 控件里不要做复杂循环或大数组操作它是逐行执行的性能不如 Java 步骤。大批量清洗建议用「正则表达式」或「拆分字段」控件。3.3 条件路由用「过滤记录」做分流一张源表里可能混了正常订单和测试订单需要分开处理。过滤记录控件可以配条件比如order_type TEST满足条件的走一条线不满足的走另一条线。两条线可以接不同的目标表或者一条直接丢弃。转换结构 [CSV 输入] - [过滤记录] --(order_typeTEST)-- [空操作] | --(默认)-- [表输出]参数说明过滤记录的条件表达式支持、、、、LIKE、IN等。字符串比较要加引号数字不用。如果条件写错比如把写成Spoon 不会报错但所有行都会走默认分支表现是「过滤没生效」。排查时看步骤度量里两条出口的行数分布。4. 数据库连接与驱动MySQL、Oracle、UcanAccess 怎么配4.1 JDBC 驱动放哪里Spoon 自带一些驱动但 MySQL 8、Oracle 新版、Access 的 UcanAccess 通常要自己放。驱动 jar 包放到># 把驱动 jar 复制到 lib 目录 cp mysql-connector-java-8.0.28.jar /opt/pdi/data-integration/lib/ cp ucanaccess-5.0.1.jar /opt/pdi/data-integration/lib/ # 重启 Spoon ./spoon.sh逻辑说明Spoon 启动时会扫描lib目录下的所有 jar把它们加入 classpath。如果驱动没放对位置新建数据库连接时「测试」按钮会报No suitable driver found。参数上UcanAccess 还需要额外的jackcess、commons-lang3等依赖建议直接下 UcanAccess 的完整包把里面所有 jar 都放进去。4.2 连接配置里的坑MySQL 连接 URL 要加时区和字符集参数否则可能报时区错误或中文乱码jdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseOracle 的 URL 格式不同且需要ojdbc8.jar。Access 用 UcanAccess 时URL 形如jdbc:ucanaccess:///path/to/database.accdb提示连接测试通过不代表转换能跑通。如果目标表字段类型和 Spoon 推断的不一致运行时才报错。建议先用「表输入」控件读一条数据预览。4.3 连接池与事务Spoon 默认每条转换用一个连接跑完就关。如果转换里步骤多、数据量大频繁开关连接会拖慢速度。可以在数据库连接的高级设置里勾选「使用连接池」但要注意连接池参数初始连接数、最大连接数配大了会占满数据库连接数。事务方面表输出默认自动提交如果希望批量提交在「表输出」控件里设置「提交记录数量」比如 1000 条提交一次。5. 避坑与排查Spoon 跑不通时先看这 5 条5.1 现象启动 Spoon 报 Java 版本错误原因系统默认 Java 版本低于 Spoon 要求或者JAVA_HOME指向了 JRE 而不是 JDK。解决java -version确认版本编辑spoon.sh或设置环境变量export JAVA_HOME/usr/lib/jvm/java-11-openjdk再启动。5.2 现象CSV 输入预览正常运行后中文乱码原因CSV 文件编码和控件里选的编码不一致。文件是 GBK控件选了 UTF-8。解决用file -i filename.csv看文件编码或者在文本编辑器里另存为 UTF-8。控件里编码选对后预览和运行结果一致。5.3 现象表输出报「字段长度超出」原因源数据某字段实际长度超过目标表定义。Spoon 的字段选择里虽然改了类型但没限制长度。解决在字段选择里给 String 字段设「长度」或者在目标表把 varchar 改大。更稳妥的做法是在 JavaScript 里做截断name name.substring(0, 100);。5.4 现象转换跑完目标表行数比源少原因中间有过滤记录、JavaScript 跳过、或者主键冲突被忽略。解决看每个步骤的「写出行数」和「错误行数」定位到行数减少的那一步。如果是主键冲突表输出控件里可以设置「忽略插入错误」但这样会静默丢数据不建议。5.5 现象UcanAccess 连接 Access 报 ClassNotFound原因UcanAccess 依赖的 jar 没放全或者放到了错误的目录。解决确认lib目录下有ucanaccess、jackcess、commons-lang3、commons-logging、hsqldb这几个 jar。缺一个都会报不同的 ClassNotFound。6. 进阶用 Kitchen 定时跑转换以及 Spoon 里调优的一个小技巧Spoon 是图形界面适合开发和调试但生产环境不可能开着图形界面跑。Kettle 提供了Kitchen跑作业和Pan跑转换两个命令行工具在># 执行转换文件 ./pan.sh -file:/path/to/transform.ktr -level:Basic # 执行作业文件 ./kitchen.sh -file:/path/to/job.kjb -level:Basic参数说明-level控制日志级别Basic只打关键信息Detailed会打每行数据调试时用生产环境别用。-param可以传参数比如-param:date2024-01-01转换里用${date}引用。调优方面一个我踩过坑的习惯在转换的最后一步加一个「空操作」控件把不需要的字段全部移除。Spoon 在步骤之间传递的是行数据字段越多内存和序列化开销越大。尤其是从宽表读几十个字段但只用其中几个时在字段选择里把不用的字段移除跑大批量数据能明显看到内存下降。这个习惯不改变逻辑但能让同样的 JVM 内存跑更多数据。另一个验证方法是先用「表输入」加LIMIT 100跑通逻辑确认字段映射和清洗规则没问题再把LIMIT去掉跑全量。直接跑全量一旦中间某步报错回滚和排查成本都高。我一般会在转换里留一个「调试」分支用过滤记录把前 100 行引到本地文件输出方便对比。希望帮到你。本文还有配套的精品资源点击获取
返回列表