
简介面向具备一定编程基础、工作1—3年的研发人员这份PPT系统梳理ETL与Kettle的基础知识适合数据库开发、数据仓库入门及数据同步场景的快速学习。内容以PDI 9.2演示覆盖ETL概念、Kettle安装与目录结构、转换和作业、数据库连接、核心组件及注意事项并延伸到项目落地、不足点与数据同步调优思路。压缩包共1个pptx文件大小约859KB结构集中便于按章节浏览和课堂讲解。已有1466人学习读者可借助26张幻灯片建立从抽取、转换到装载的完整认知理解步骤、跳、数据行等核心概念并对照MySQL、Oracle实践数据库连接与调试。1. 解压就能用的 PDI 9.2为什么一启动就闪退ETL 这条链路上kettle 这个名字出现频率一直很高现在的正式叫法是 PDIPentaho Data Integration9.2 是很多存量项目还在用的版本做 ETL 数据同步的岗位几乎绕不开它。它纯 Java 编写、绿色免安装解压完双击 spoon 就能拖控件画流程这也正是新手最容易低估的地方不用装但必须先把 Java 环境、解压路径、字符集这三件事对齐否则表现就是窗口闪一下、黑屏两秒退出或者界面出来了却连不上数据库。下面按真实安装顺序走一遍从版本选型到命令行调度再到装坏了怎么救。2. 装前把环境列清JDK、路径、字符集三件事经常有人直接问哪里下 PDI其实下载只占十分钟返工全发生在环境上。我一般把环境确认放在解压之前因为这三件事任何一件不对后面的界面操作全是白费功夫JDK 版本决定能不能起来解压路径决定插件能不能加载字符集决定跑出来的中文是正常字还是问号。先把这三项落到具体命令上再去碰 Spoon 界面。2.1 JDK 选 8 还是 119.2 的兼容边界PDI 9.2 的主线还是围绕 JDK 8 构建的包里那些 jar 和插件在 8 上最稳。用 JDK 11 有时也能拉起界面但常见现象是打开某个插件步骤时报 NoClassDefFoundError或者连接向导里点不动数据库类型下拉框这种报错不会告诉你「你 JDK 用错了」只会甩一段栈很耗时间。JDK 17 及以上就别试了起不来的概率非常高。我的做法是机器上单独放一套 JDK 8只给 PDI 用不跟其他服务抢 JAVA_HOME# 先看当前 shell 里生效的是哪套 JDK别想当然 java -version # 给 PDI 单独指定 JDK 8路径按自己机器实际放的来 export PENTAHO_JAVA_HOME/opt/jdk8 export JAVA_HOME/opt/jdk8 export PATH$JAVA_HOME/bin:$PATH # 写进 profile避免换个终端登录又回到默认 JDK echo export PENTAHO_JAVA_HOME/opt/jdk8 /etc/profile.d/pdi.sh echo export PATH/opt/jdk8/bin:$PATH /etc/profile.d/pdi.shPENTAHO_JAVA_HOME是 PDI 启动脚本优先看的环境变量设置它比设置 JAVA_HOME 更精准因为不影响机器上其他 Java 程序。启动脚本spoon.sh、pan.sh、kitchen.sh 都会先调 set-pentaho-env.sh一般是按PENTAHO_JAVA_HOME→JAVA_HOME→PATH里的 java 这个顺序去找运行时所以只要前者设对了机器上装几个 JDK 都不打架。注意java -version显示 1.8 不代表启动脚本用的就是它一定要用echo $PENTAHO_JAVA_HOME复核一遍这一步能省掉大量「明明装了 JDK 8 还闪退」的排查。2.2 解压路径和内存两个最容易返工的参数解压路径不要带空格、不要带中文、不要放在桌面那种带用户名的深目录里。PDI 的启动脚本里对路径做了拼接路径一旦有空格插件扫描阶段就会静默失败界面上看不出任何异常只是该出现的步骤不见了。统一放到/opt/pdi这种干净位置多版本共存时靠目录名区分mkdir -p /opt/pdi unzip pdi-ce-9.2*.zip -d /opt/pdi # 解压出来统一是># 打开启动脚本找 PENTAHO_DI_JAVA_OPTIONS 这一行 grep -n PENTAHO_DI_JAVA_OPTIONS /opt/pdi/data-integration/spoon.sh把那一行改成PENTAHO_DI_JAVA_OPTIONS-Xms2048m -Xmx6144m -Dfile.encodingUTF-8这种形式。-Xms和-Xmx建议设成一样大省掉堆反复扩张的开销-Xmx控制在物理内存的一半到七成之间留出空间给操作系统和数据库客户端。老教程里常见的-XX:MaxPermSize256m在 JDK 8 上已经不生效了留着只会打印一行警告删掉更清爽。改完必须重启 Spoon 才生效命令行跑 pan/kitchen 时读的是同一份配置。2.3 数据库驱动与字符集先放 jar 再谈连接PDI 自带的驱动只覆盖一部分数据库MySQL 8、Oracle 这类生产常用的驱动我都是自己放。位置只有一个># MySQL 8 必须用 8.x 的驱动5.1.x 会报 CLIENT_PLUGIN_AUTH 相关错误 cp ~/drivers/mysql-connector-java-8*.jar /opt/pdi/data-integration/lib/ # 放完确认一下PDI 只扫 lib 和 plugins 下的 jar ls -l /opt/pdi/data-integration/lib | grep -i mysql驱动文件名里的版本号尽量别改PDI 不会去解析它但人排查的时候一眼能看出用的是哪个版本。放完要重启热加载不生效。字符集这块Windows 上做的 .ktr 拷到 Linux 上跑中文列名变问号、导出 CSV 变乱码八成是 file.encoding 的问题。最稳的做法是在启动参数里固定住# 与内存参数写在同一行不要写成两条 export后一条会覆盖前一条 export PENTAHO_DI_JAVA_OPTIONS-Xms2048m -Xmx6144m -Dfile.encodingUTF-8-Dfile.encodingUTF-8影响的是 JVM 层面的默认字符集PDI 读写文本文件时如果没在步骤里单独指定编码就会走这个默认值。所以「步骤里指定编码」和「JVM 参数指定编码」两处都做才算闭环。3. 解压即用Spoon 第一次启动与目录结构逐个认解压完那一堆文件看着杂其实每类都有明确归属认得清目录后面出问题才知道该看哪个文件。这一章先把目录过一遍再启动界面最后把命令行那四个脚本记住——真正上生产调度的时候没人会开着图形界面点运行。3.1 目录结构清单与哪些能删哪些不能动下面这张表是我自己整理的一份对照标了动它的风险等级删之前先看一眼目录 / 文件作用能不能动classes生命周期监听、注册表扩展、日志配置不改除非改日志级别lib支持库 jar、数据库驱动只增不改放驱动的地方libswt图形界面库 jar不动动了界面起不来plugins各类步骤插件不动装插件才往里加samples自带示例转换和作业可删但建议留着当模板simple-jndiJNDI 连接配置文件配连接池时才改pwd集群相关配置单机不用管system系统级配置目录不动ui软件界面资源不动docs文档可删launcher启动器配置不动Spoon.bat / spoon.sh启动图形界面改内存参数在这里Pan.bat / pan.sh命令行运行转换调度主力Kitchen.bat / kitchen.sh命令行运行作业调度主力Carte.bat / carte.sh启动集群 / 远程执行服务分布式时才用Encr.bat / encr.sh加密算法工具生成加密密码配密码时用Import.bat / import.sh资源导入迁移时用set-pentaho-env.bat / .sh设置环境变量找 java 的逻辑在这表格里最需要记的是 lib、plugins 这两个装驱动和装插件全都落在这两处最容易误删的是 samples删了不影响运行但里面有几个现成的输入输出示例新版本上手时拿来对照字段映射很省事。3.2 Spoon 首次启动与界面实操# Linux 下启动图形界面需要有 X 或者 VNC 转发 cd /opt/pdi/data-integration ./spoon.sh # 起不来的时候用 debug 脚本它会把 JVM 参数和堆栈打出来 ./spoonDebug.sh启动后第一眼看到的是核心对象树、画布和下方的执行结果面板。新建一个转换从左侧树里把「CSV 文件输入」拖到画布再把「Excel 输出」拖进来按住 Shift 从第一个步骤拉到第二个一条带箭头的线就是跳hop。保存时转换存成 .ktr作业存成 .kjb两种文件别搞混用 pan 跑 .kjb 会直接报错。界面上还有两个位置值得先摸清右上角的「执行」按钮旁边可以选运行方式本地跑还是注册到 Carte 上跑下方的结果面板里依次是执行日志、步骤度量、性能图调优时真正看的是步骤度量里的读写行数和耗时日志只能告诉你有没有报错。3.3 命令行四件套pan、kitchen、carte、encr图形界面适合开发调试上调度必须是命令行。四个脚本的分工很清楚cd /opt/pdi/data-integration # 跑转换-file 指定 ktr-level 控制日志级别-param 传业务日期这类变量 ./pan.sh -file/data/etl/sync_user.ktr -levelBasic -param:RUN_DATE2024-06-01 # 跑作业作业里可以串多个转换还能加条件判断和邮件告警 ./kitchen.sh -file/data/etl/daily_job.kjb -levelBasic -param:RUN_DATE2024-06-01 # 生成加密密码配数据库连接或 Carte 认证时用得上 ./encr.sh -ciphertext-level常用的几个值是Basic、Detailed、Debug生产调度一般挂 Basic出问题临时调 Detailed 复跑一次日志量差一个数量级。-param:后面跟的变量要在转换里用${RUN_DATE}这种形式引用注意作业和转换的变量作用域是分开的作业里定义的参数不会自动传到子转换得在「转换」作业项里显式勾选传递参数这是个很常见的坑。Carte 是常驻服务分布式执行和远程触发都靠它# 启动 Carte 服务第一个参数监听地址第二个是端口 ./carte.sh 0.0.0.0 8080单机跑同步用不到 Carte但只要涉及多台机器分工、或者不想让调度系统直接 ssh 到数据机上跑就是它出场。4. 转换与作业把数据流跑通的最小配置界面能起来只是开始真正要落地的是「一个同步流程从源库到目标库跑通」。PDI 里两种文件承担两种职责转换负责数据行的处理作业负责流程控制搞清楚这个分工后面配连接、配增量才不会乱。4.1 转换里的 step 和 hop转换由步骤Step和跳Hop组成。步骤是干活的读文件、过滤、清洗、写库都算跳是连线定义数据往哪走。每个步骤有唯一名字转换范围内不能重名除「生成记录」这种只写不读的步骤绝大多数步骤都是读一批行、处理、再写出去。跳背后是一个行集缓存大小在转换属性里配。行集满了上游步骤就停下来等行集空了下游步骤就等着。这个机制让每个步骤能跑在独立线程里并发度高、内存占用小但也带来一个反直觉的结论转换里没有执行顺序。启动那一刻所有步骤同时起来谁先谁后取决于数据什么时候流过来。如果你的逻辑必须按顺序走比如先删分区再插数据那就别在转换里硬凑改用作业。这个区分我见过太多人绕不过来结果在转换里加各种「先执行」「后执行」的假想连線实际根本没生效。分发和复制是跳的两种发送方式在连线上右键就能切换。分发是目标步骤轮流接记录适合做负载分摊复制是每条记录同时发给所有下游适合一份数据同时写两个目标库。选错的表现是数据重复或数据缺失而且不报错只能靠对账发现。4.2 作业控制执行顺序作业里也有跳但语义完全不同作业的跳是有方向的上一个作业项跑完才走下一个。作业项可以是转换、可以是 SQL、可以是 shell 脚本也可以是条件判断。日常同步作业的骨架通常是先跑一个「开始」接「转换」清洗维表接「条件判断」检查影响行数成功走「转换」加载事实表失败走「发送邮件」或「写日志表」。这里有个实用细节作业项里调用转换时可以把作业的参数往下传也可以在「执行每一个输入行」模式下让一个转换对上游结果集的每一行跑一次做多表批量同步很方便。开关就在作业项的设置里勾不勾效果差很远。4.3 数据库连接配置与驱动放置连接配在「主对象树 → 数据库连接」里新建时选择类型、填主机端口库名、用户名密码然后点「测试」。测试按钮才是唯一可信的判断依据保存了不代表能连。连接参数里有几个值得单独说字符集相关的useUnicodetruecharacterEncodingutf8MySQL 必加不然中文进去就变问号时区的serverTimezoneAsia/Shanghai不加的话 MySQL 8 经常报时区识别异常日期字段整体偏移连接池默认是非池化的同步任务量大时建议在「选项」里打开连接池或者直接走 JNDI。JNDI 方式适合多环境切换把连接信息写进simple-jndi/jdbc.properties转换里引用 JNDI 名字开发、测试、生产共用一份 ktr改配置文件就能切库不用逐个步骤改连接。# simple-jndi/jdbc.properties 里的写法示例示意值按实际环境填 MYSQL_DW/typejavax.sql.DataSource MYSQL_DW/drivercom.mysql.cj.jdbc.Driver MYSQL_DW/urljdbc:mysql://db-host:3306/dw?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai MYSQL_DW/useretl_user MYSQL_DW/password******配完重启在连接类型里选「JNDI」再填MYSQL_DW就能用。密码别明文留在 ktr 里PDI 自带的加密工具生成的密文可以直接填进连接密码框。4.4 一份最小可跑的数据同步配置场景很典型源库一张业务表按更新时间增量同步到目标库。四个步骤足够——表输入、字段选择、插入/更新、空操作收尾。表输入的 SQL 里用问号占位或者直接引用变量勾上「替换 SQL 语句里的变量」-- 增量抽取RUN_DATE 由调度命令行 -param 传入 SELECT id, user_name, mobile, update_time FROM biz_user WHERE update_time ${RUN_DATE} 00:00:00 AND update_time DATE_ADD(${RUN_DATE} 00:00:00, INTERVAL 1 DAY)时间字段如果源端是字符串插到目标库前要转成日期类型否则比较和排序全按字符串走。这种规整放在「JavaScript 代码」步骤里最直接// 步骤日期规整str2date 是 PDI 脚本步骤内置函数 var src row[update_time]; if (src ! null src ! ) { // 源端格式固定为 yyyy-MM-dd HH:mm:ss解析后回写 Date 类型 row[update_time] str2date(src, yyyy-MM-dd HH:mm:ss); }row是当前数据行的字段集合按字段名取值和赋值str2date的第二个参数是格式串必须和源数据完全一致多一个空格都会返回 null。写回去的字段类型要在步骤的「字段」页签里声明成 Date否则下游还是按原类型接。目标端用「插入/更新」在「用来查询的关键字」里选主键 id更新字段里勾上需要覆盖的列。这一步等价于 upsert重复跑不会产生脏数据比纯「表输出」安全得多尤其是调度重跑的场景。5. 装完跑不通的五个坑从闪退到卡死逐个排查这几个是安装和首次运行阶段出现频率最高的现象都很像「装坏了」实际原因集中在环境和参数上。按现象、原因、解决顺序记一遍下次遇到能少烧一半时间。5.1 Spoon 双击闪退或黑屏两秒退出现象命令行看得到 java 进程起来又没了界面上什么都没留下。原因启动脚本没找到合适的 JDK或者解压路径带空格导致类路径拼接断裂。前者最常见机器上默认 java 是 11 或 17脚本直接用了它。解决先确认echo $PENTAHO_JAVA_HOME有值且指向 JDK 8再用./spoonDebug.sh启动看堆栈。如果是路径问题把整个>cd /opt/pdi/data-integration # 版本信息能打出来说明 java 环境和类路径都是通的 ./pan.sh -version # 图形界面起得来说明 SWT 库和显示环境没问题 ./spoon.sh第二步验连接。在 Spoon 里对每个要用的数据库点一次「测试」特别注意测试成功之后立刻新建一个只含「表输入 空操作」的最小转换SQL 写SELECT 1跑一次。连接测试走的是驱动层握手真正执行才走查询和结果集两者能不能过经常不是一回事。第三步验数据。拿一张小表跑完整的增量链路跑完对账验证项怎么查通过标准行数源表和目标表 count 对比增量窗口内数量一致主键重复目标表按主键 group by having count1无结果字段类型查目标表 information_schema日期是 datetime金额是 decimal重跑幂等同一 RUN_DATE 再跑一遍行数不变无报错调度可执行用 kitchen.sh 带 -param 跑作业日志结尾是执行完成第三步里最容易漏的是重跑幂等。第一次跑通很容易隔天补数据重跑一次就出重复行说明目标端用的是纯「表输出」而不是「插入/更新」。这个检查加进验证清单后面能省掉很多对账的麻烦。那次在生产机上排查一个「装好了但跑不出数据」的问题最后发现是转换里两个分支的跳没接下游行集满了互相等日志一片安静。从那以后我每次落地一套 PDI跑通最小转换之后必须再补一次「故意重跑」确认幂等和日志都能看懂才敢往调度上挂。希望帮到你。本文还有配套的精品资源点击获取