
简介Kettle 9.3pdi-ce-9.3.0.0-428是一款开源ETL工具的分卷压缩包第二部分面向数据工程师、数据分析师及需要做数据抽取、转换与加载的开发者解决跨平台数据集成与批量数据处理问题。该版本纯Java编写可在Windows、Linux、Unix上运行绿色免安装已内置JRE解压后双击spoon.bat即可启动图形化界面Spoon通过拖拽方式设计转换与作业流程。压缩包共约2000个文件以618个jar核心依赖、196个ktr转换脚本、19个kjb作业文件为主另含xml、properties、sh、bat等配置与启动脚本以及少量xlsx、csv示例数据整体约799.81MB因单文件超限而分卷提供。目前已有876人学习下载。资源完整保留了Kettle的插件库、示例转换与配置模板适合用于搭建本地ETL实验环境、研究Spoon组件结构、复用转换脚本及排查数据集成问题。1. Kettle 9.3 压缩包到手之后pdi-ce-9.3.0.0-428 到底该怎么落地很多人第一次拿到pdi-ce-9.3.0.0-428这个压缩包时第一反应是「解压完点哪个文件」。这个包是 Pentaho Data Integration Community Edition 的 9.3 版本社区里习惯叫它 Kettle。它解决的核心问题很具体把散落在 MySQL、Oracle、CSV、Excel 里的数据抽出来做清洗、转换、加载全程可视化拖拽不用为每个同步任务写一遍 JDBC 代码。适合谁做数据仓库 ETL 的、做报表前置清洗的、临时要导几百万行数据的运维和数据分析同学。但压缩包本身不带安装程序解压后能不能跑起来取决于 JDK 版本、驱动放置位置、Spoon 启动脚本这几个点。下面按「先跑通、再配驱动、再避坑」的顺序讲清楚。2. 解压即用的前提JDK 与 Spoon 启动链路Kettle 9.3 是 Java 写的压缩包解压后目录里没有 exe只有spoon.batWindows和spoon.shLinux/macOS。所以第一件事不是双击而是确认 JDK。9.3 官方要求 JDK 8实测 JDK 11 也能跑但 JDK 17 会因为模块化限制在启动时抛IllegalAccessError这是最常见的翻车点。2.1 目录结构与启动入口解压pdi-ce-9.3.0.0-428.zip后你会看到>java -version输出里出现1.8.0_xxx或11.0.x即可。如果是 17 及以上建议装一个 JDK 8 或 11 并设置JAVA_HOME指向它而不是改系统默认。Windows 下可以临时在命令行里set JAVA_HOMEC:\Program Files\Java\jdk1.8.0_351 set PATH%JAVA_HOME%\bin;%PATH%然后进入>chmod x spoon.sh pan.sh kitchen.sh ./spoon.sh逻辑说明spoon.sh内部会读取JAVA_HOME找不到就报Unable to find java。参数上spoon.sh支持-main指定入口类、-level指定日志级别日常调试用./spoon.sh -levelDebug能看到更细的初始化日志。第一次启动会弹欢迎界面关掉后进入主界面左侧是「转换」和「作业」两个核心概念转换做数据流作业做流程控制。2.2 内存参数与启动失败排查默认spoon.bat里PENTAHO_DI_JAVA_OPTIONS给的是-Xms1024m -Xmx2048m。如果你机器内存小启动到一半卡死或报OutOfMemoryError: Metaspace就要改这个值。Windows 下编辑spoon.bat找到set PENTAHO_DI_JAVA_OPTIONS-Xms512m -Xmx2048m -XX:MaxPermSize256m把-Xmx调到物理内存的一半以内比如 8G 机器给 4096m。Linux 下同理改spoon.sh里的PENTAHO_DI_JAVA_OPTIONS。注意-XX:MaxPermSize在 JDK 8 之后已废弃JDK 11 下会打印警告但不影响运行可以删掉。启动失败的典型现象窗口一闪而过。这时不要双击用命令行启动看控制台报错。常见的是Could not create the Java Virtual Machine多半是-Xmx超过了可用内存还有NoClassDefFoundError: org/eclipse/swt/...说明libswt下没有对应系统的 SWT 库检查是否解压完整。3. 数据库驱动与 Ucanaccess让 Kettle 连上你的库Kettle 本身只带少数驱动MySQL、Oracle、SQL Server 的驱动都要自己放进lib/。这一步不做新建连接时下拉框里根本找不到对应类型或者测试连接直接报No suitable driver。3.1 各数据库驱动放置与连接配置驱动统一放>jdbc:mysql://192.168.1.10:3306/etl_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse参数说明serverTimezone必须显式指定useSSLfalse在测试环境避免证书握手失败生产环境按实际证书配置。填完点「测试」出现「连接成功」再保存。3.2 Ucanaccess 读取 Access 文件的配置热搜里kettle ucanaccess 驱动出现频率很高因为 Kettle 原生不支持.accdb。做法是下载 Ucanaccess 的 jar 包集合ucanaccess、jackcess、commons-lang、commons-logging、hsqldb全部丢进lib/然后新建连接时选「MS Access」下的「Ucanaccess」或者直接用通用 JDBCjdbc:ucanaccess://D:/data/source.accdb;memoryfalsememoryfalse表示不把整个库加载进内存大文件必须加否则几百万行的 accdb 会直接把 Spoon 撑爆。连接类名填net.ucanaccess.jdbc.UcanaccessDriver。配好后在「表输入」步骤里就能像普通表一样写 SQL 查询 Access 数据。3.3 用 JavaScript 步骤做字段清洗热搜里kettle 中javascript代码也是高频需求。转换里加一个「JavaScript 代码」步骤可以写 Rhino 引擎支持的 JS。比如把手机号中间四位打码// 输入字段phone // 输出字段phone_mask var p phone; if (p ! null p.length 11) { phone_mask p.substring(0, 3) **** p.substring(7); } else { phone_mask p; }逻辑说明Kettle 的 JS 步骤里输入字段直接当变量用输出字段直接赋值即可不需要var声明输出。参数上步骤配置里要把phone勾选为输入、phone_mask填为输出。注意 Rhino 不支持 ES6 的let、箭头函数写了会报语法错误这是很多人从浏览器 JS 迁过来时的血泪经验。4. 数据抽取实战从 CSV 到 MySQL 的最小转换光连上库不算落地跑通一条完整的数据抽取链路才算。下面用「CSV 文件 → 字段清洗 → 写入 MySQL」这个最小场景把转换的搭建过程拆开。4.1 转换的四个核心步骤一个转换由多个步骤Step和跳Hop组成。最小链路是「CSV 输入」读取文件配置分隔符、编码、字段名和类型。「JavaScript 代码」或「字段选择」做清洗。「表输出」写入目标库配置目标表和字段映射。用「空操作」或直接连到表输出作为终点。CSV 输入配置里编码选UTF-8如果文件是 Excel 另存的 CSV常见是GBK选错会看到中文变乱码。分隔符默认逗号字段类型要手动指定比如金额列选Number、精度 2日期列选Date、格式yyyy-MM-dd。不指定类型Kettle 全按 String 处理后续计算会出问题。4.2 表输出的批量参数与性能「表输出」步骤里有个「提交记录数量」默认 1000。这个值直接决定写入性能。太小频繁提交事务慢太大失败时回滚代价高。经验值本地库 5000远程库 1000 到 2000。另外勾选「使用批量插入」Kettle 会拼INSERT INTO ... VALUES (...),(...),...比逐条插入快一个数量级。如果目标表已存在且要更新用「插入/更新」步骤而不是「表输出」。配置里指定用来比对的键字段Kettle 会先查再决定 insert 还是 update。注意这个步骤对每行都要查一次数据量大时很慢常见优化是先全量灌到临时表再用 SQL 做 merge。4.3 命令行调度pan 与 kitchen图形界面跑通后生产环境要用命令行。转换用pan.sh作业用kitchen.sh./pan.sh -file/data/etl/csv_to_mysql.ktr -levelBasic -logfile/data/etl/logs/run.log参数说明-file指定转换文件-level是日志级别None、Error、Minimal、Basic、Detailed、Debug、Rowlevel-logfile把日志落盘。作业调度./kitchen.sh -file/data/etl/daily_job.kjb -levelBasic -logfile/data/etl/logs/job.logkitchen.sh支持-param传参比如-param:run_date2024-01-01作业里用${run_date}引用。这样同一套作业可以按天跑不用改文件。配合 crontab 或 Windows 任务计划就完成了从手动到自动的过渡。5. 避坑与排查Kettle 9.3 最常见的五类问题这一章全是踩过的坑按「现象 → 原因 → 解决」写遇到问题直接对号入座。5.1 启动报 JDK 版本不兼容现象命令行启动 Spoon报UnsupportedClassVersionError或IllegalAccessError窗口起不来。 原因Kettle 9.3 编译目标是 JDK 8用 JDK 17 运行时模块访问受限。 解决装 JDK 8 或 11把JAVA_HOME指过去不要改系统全局用启动脚本里临时设置即可。5.2 中文乱码现象CSV 读进来中文是问号或方块或者写入 MySQL 后中文变???。 原因文件编码、Kettle 运行编码、数据库字符集三者不一致。 解决CSV 输入步骤显式选编码MySQL 连接串加characterEncodingutf8数据库表和字段用utf8mb4。三处都对齐才彻底解决。5.3 驱动放了还是连不上现象驱动 jar 已放进lib/新建连接测试仍报No suitable driver found。 原因Spoon 没重启或者放的是错误版本的驱动或者连接串协议头写错。 解决放驱动后必须重启 Spoon确认 jar 版本和数据库版本匹配连接串协议头jdbc:mysql://不能少。5.4 转换跑着跑着内存溢出现象处理大文件时 Spoon 卡死日志报OutOfMemoryError: Java heap space。 原因默认堆内存 2G且某些步骤如排序、聚合会把数据全加载进内存。 解决调大-Xmx对大数据量场景用「排序记录」时勾选「临时文件」而不是内存排序能分片就分片处理。5.5 定时任务里跑失败但手动正常现象crontab 里执行kitchen.sh报错手动执行同样命令却成功。 原因cron 环境变量不完整JAVA_HOME和PATH没加载。 解决在脚本里显式export JAVA_HOME...和export PATH...或者用绝对路径调用 java。这是最隐蔽的一类问题日志里往往只报java: command not found。6. 进阶技巧用参数化与日志把 Kettle 用成生产工具跑通单次转换只是起点真正让 Kettle 在生产环境站住脚的是参数化和可观测性。我一般会在作业里做两件事一是把日期、库名、文件路径全部抽成参数二是把每次运行的关键指标写进一张日志表。参数化用「作业」里的「设置变量」步骤或者命令行-param传入。转换里用${变量名}引用比如表输入 SQL 写成SELECT * FROM orders WHERE create_date ${run_date}这样一套转换可以按天复用。注意${}是 Kettle 的变量语法和 shell 的$不冲突但在 SQL 里要防止注入参数值来源要可控。日志表方案在作业末尾加一个「表输出」或「执行 SQL 脚本」步骤把${run_date}、开始时间、结束时间、处理行数写进etl_run_log表。处理行数可以从转换的「统计」步骤拿到或者用「获取系统信息」步骤取。这样出问题时不用翻日志文件直接查表就知道哪天的任务跑了多久、灌了多少行。还有一个容易被忽略的点转换文件.ktr和作业文件.kjb本质是 XML可以用 Git 管理。团队协作时把style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />