简介:本资源为 Kettle 9.3(pdi-ce-9.3.0.0-428)分卷压缩包的第二部分,面向数据工程师、ETL 开发人员及需要做数据抽取、转换与加载的初学者与进阶用户。Kettle 是纯 Java 编写的开源 ETL 工具,绿色免安装,跨 Windows、Linux、Unix 平台运行,压缩包内已集成 JRE,解压后双击 spoon.bat 即可启动 Spoon 图形界面,通过拖拽方式设计转换与作业流程。资源共约 2000 个文件,以 618 个 jar 依赖库、196 个 ktr 转换脚本、19 个 kjb 作业文件为主,另含 properties、xml、sh、bat 等配置与启动脚本,以及少量 xlsx、csv 示例数据,压缩包约 799.81MB。因单文件超过 1000MB 限制,需与资源 1 合并解压后使用。目前已有 876 人学习下载,适合用来搭建本地 ETL 实验环境、研究转换与作业的模块化组织方式,并参考内置示例快速上手数据集成任务。
1. Kettle 9.3 压缩包到手之后:先别急着解压,搞清楚 pdi-ce 这五个字母在说什么
很多人第一次拿到pdi-ce-9.3.0.0-428这个压缩包,第一反应是双击解压、找Spoon.bat、点开就干。结果要么是闪退,要么是连不上数据库,要么是 JavaScript 步骤报错,然后开始满世界搜「kettle下载安装教程」。问题不在手速,在于没搞清楚这个包到底是什么。pdi-ce 是 Pentaho Data Integration Community Edition 的缩写,Kettle 是它的曾用名,9.3 是版本线,9.3.0.0-428是具体的构建号。这个压缩包是绿色免安装的,解压即用,但它对 Java 版本、字符编码、驱动放置位置都有硬性要求。这篇笔记面向的是已经拿到这个包、准备在本地或测试环境跑通数据抽取的工程师,从解压路径讲到 JavaScript 步骤调试,把每一步的参数和坑都摊开说。如果你还在犹豫要不要用 Kettle 做 ETL,看完前两章基本能判断。
2. 解压、Java 环境与首次启动:pdi-ce-9.3 跑起来的最小闭环
2.1 解压路径为什么不能带中文和空格
Kettle 的启动脚本Spoon.bat(Windows)和spoon.sh(Linux/macOS)内部会拼接%KETTLE_HOME%和JAVA_HOME的路径。如果解压路径里有中文、空格或特殊符号,脚本在解析时会把路径截断,表现为双击后命令行窗口一闪而过,或者报Could not find or load main class。我一般把压缩包解到D:\pdi-ce-9.3.0.0-428或/opt/pdi-ce-9.3.0.0-428,路径全英文、无空格、层级尽量浅。解压后目录结构里,># Windows 下编辑 Spoon.bat,在 @echo off 之后加一行 set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_301 set PATH=%JAVA_HOME%\bin;%PATH%
# Linux/macOS 下编辑 spoon.sh,在开头加 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH这样做的逻辑是:Kettle 启动时优先读脚本里设置的JAVA_HOME,不会污染系统环境。参数上,jdk1.8.0_301只是示例,你换成自己机器上实际的 JDK 8 路径即可。验证方式是在命令行执行java -version,确认输出是1.8.0_xxx。如果启动时看到Unsupported major.minor version 52.0之类的报错,基本就是 Java 版本不对,52.0 对应 Java 8,版本号对不上就换 JDK。
2.3 首次启动要改的两个默认配置
第一次打开 Spoon 之后,别急着建转换。先做两件事:一是改字符编码,二是确认KETTLE_HOME的位置。字符编码在>jdbc:ucanaccess://D:/data/test.accdb;memory=false
驱动类名填net.ucanaccess.jdbc.UcanaccessDriver。memory=false这个参数很关键,它让 UCanAccess 以文件流方式读写而不是全量加载到内存,处理大文件时不会撑爆 JVM。用户名和密码留空即可。测试连接如果报UcanaccessDriver not found,检查 jar 包是否放齐,四个缺一不可。
3.3 连接池参数怎么设才不拖垮源库
在「数据库连接」的高级面板里,有几个参数直接影响抽取性能。MSSQL和Oracle这类库,默认的fetch size是 1000 行,如果单表数据量超过百万,建议调到 5000 到 10000,减少网络往返次数。但不要调太大,否则客户端内存压力会上升。连接池的initial size和max active在 Kettle 里对应的是「连接池」选项卡下的设置,我一般把initial size设为 2,max active设为 10,够用且不会把源库连接数占满。如果抽取过程中报ORA-00020: maximum number of processes exceeded,就是max active设太大了,调小即可。这些参数没有万能值,需要根据源库的负载和网络延迟做几次压测来定。
4. JavaScript 步骤与数据抽取逻辑:kettle 中 javascript 代码怎么写才不翻车
4.1 JavaScript 步骤的引擎选择与变量作用域
Kettle 9.3 的「JavaScript 代码」步骤默认用的是 Rhino 引擎,不是 Node.js,也不是浏览器里的 V8。这意味着 ES6 的let、const、箭头函数、模板字符串统统不支持,只能用var和传统函数写法。变量作用域也需要注意:在「脚本」区域声明的变量是局部的,只在当前行有效;要跨行保留状态,得用_step_对象或者「脚本」里的trans_Status。常见做法是把需要累积的值挂在_step_上,比如_step_.totalCount = (_step_.totalCount || 0) + 1。这个细节不搞清楚,写出来的脚本要么每行都重置,要么报undefined。
4.2 一个可复用的字段清洗脚本
下面这段代码做三件事:去掉字符串首尾空格、把空字符串转成 null、对手机号做简单的格式校验。直接抄进「JavaScript 代码」步骤的脚本框即可:
// 获取输入字段 var name = trim(row_name); var phone = trim(row_phone); // 空字符串转 null if (name === '') { name = null; } if (phone === '') { phone = null; } // 手机号格式校验:11 位数字,以 1 开头 var phoneValid = false; if (phone !== null && /^1\d{10}$/.test(phone)) { phoneValid = true; } // 输出到新字段 var output_name = name; var output_phone = phone; var output_phone_valid = phoneValid;逻辑说明:trim()是 Kettle 内置函数,直接对字段值做去空格。row_name和row_phone是上一步骤传进来的字段名,必须和「字段」选项卡里定义的输入字段一致。output_前缀的变量会自动成为输出字段,不需要额外声明。参数上,正则/^1\d{10}$/只校验了位数和开头,不校验运营商号段,如果需要更严格,可以把正则换成/^1[3-9]\d{9}$/。这段脚本每行执行一次,不要在里面做数据库查询或文件读写,否则性能会断崖式下跌。
4.3 抽取大表时的分页与增量策略
用 Kettle 做数据抽取,最怕的是全量拉一张千万级表。常见做法是在「表输入」步骤里写带WHERE的 SQL,用?占位符配合「获取系统信息」或「生成记录」步骤传入时间戳。比如按update_time增量抽取:
SELECT id, name, phone, update_time FROM customer WHERE update_time > ? ORDER BY update_time占位符的值从上一个作业步骤传入,通常是上次抽取的最大时间。如果源表没有update_time字段,退而求其次用自增主键做分页,每批 5000 行,用LIMIT和OFFSET循环。但OFFSET在数据量大时越翻越慢,更好的方式是记录上一批的max(id),下一批用WHERE id > ?。这个策略在 MySQL 和 PostgreSQL 上都适用,Oracle 需要改用ROWNUM或ROWID。不管用哪种,都要在「表输入」里勾选「允许简易转换」,减少 Kettle 自身的数据类型转换开销。
5. 避坑与排查:pdi-ce-9.3 压缩包用起来最容易翻车的五个地方
5.1 启动闪退,命令行只闪一下
现象:双击Spoon.bat,黑窗口一闪就没了,Spoon 界面根本不出现。原因:九成是JAVA_HOME没设对,或者解压路径里有中文/空格导致脚本解析失败。解决:打开命令行,手动cd到># Windows 下执行作业 Kitchen.bat /file:D:\etl\daily_load.kjb /level:Basic /logfile:D:\etl\logs\daily_load.log
# Linux 下执行作业 ./kitchen.sh -file:/opt/etl/daily_load.kjb -level:Basic -logfile:/opt/etl/logs/daily_load.log参数说明:/file或-file指定作业文件路径,/level控制日志级别,Basic只记录关键信息,排查问题时可以改成Detailed或Debug。/logfile把日志写到文件,方便调度系统采集。注意Kitchen.bat的退出码:0 表示成功,1 表示步骤失败,2 表示作业执行出错,7 表示启动失败。调度系统里要根据退出码判断是否重试,不要只看日志里有没有ERROR字样。
还有一个习惯:所有.ktr和.kjb文件都用 UTF-8 保存,并且在作业的「设置」里把「日志编码」也设成 UTF-8。这样在 Linux 调度机上跑的时候,日志里的中文不会变成乱码,排查问题时不用来回转码。另外,.kettle\kettle.properties里的数据库密码是明文存储的,如果要把整个style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />