首页 / 资讯中心 / 文章详情

Kettle基础入门:Transformation与Job核心区别及实战避坑指南

Kettle基础入门:Transformation与Job核心区别及实战避坑指南 ★ FEATURED ARTICLE
简介本资源是一份面向1–3年经验研发人员的KettlePentaho Data Integration入门级教学PPT聚焦ETL核心流程与工具实操解决数据同步、清洗与集成场景中的基础建模与落地难题。全包仅含1个859KB的pptx文件内容覆盖ETL概念本质、PDI 9.2安装部署、目录结构解析、转换Transformation与作业Job双范式设计、数据库连接配置、步骤Step与跳Hop的数据流机制、常见注意事项及同步调优要点辅以字段类型、元数据定义、并发模型等底层原理说明。已有1463人学习下载适合具备MySQL/Oracle等数据库开发基础的读者边学边练——PPT中嵌入了典型CSV→Excel、多源集成等快速入门案例并明确标注了Spoon/Kitchen/Pan等核心脚本用途及集群配置路径便于对照环境快速上手与问题定位。1. 别被“ETL”和“Kettle”吓住它其实就是一个帮你自动搬数据、洗数据、存数据的智能流水线你有没有遇到过这样的场景早上刚到公司运营同事甩来一个 Excel 表说“这是昨天各渠道的订单数据快导进报表系统里”中午 DBA 发来消息“MySQL 里的用户表结构改了老字段user_name拆成了first_name和last_name请把历史数据按新规则补上”下午又收到一封邮件“BI 团队需要把微信小程序日志、APP 埋点、CRM 客户库三份数据合并成一张宽表明天一早要跑看板”……——这些事不是写几行 SQL 就能搞定的。它们要连不同系统的账号密码、要处理空值/乱码/时间格式不一致、要校验逻辑比如“下单时间不能晚于支付时间”、要分批跑避免卡死数据库、还要出错时自动重试、留日志、发通知……Kettle现在叫 PDI干的就是这件事它不写代码但比手写脚本更稳它不碰业务逻辑却让数据流动像拧开水龙头一样可控。它不是给数据库管理员DBA或大数据工程师专属的黑匣子而是给有基本 SQL 能力、会双击运行程序、想摆脱重复粘贴复制的 1–3 年研发同学准备的一套“可视化数据搬运说明书”。这份《ETL之kettle基础-PPT讲解》就是从零带你摸清这套说明书怎么读、哪页该先翻、哪个按钮点了不会翻车——它不讲源码编译不推分布式集群就讲清楚怎么装、怎么连库、怎么拖两个组件就把 CSV 变成 Excel、怎么让数据自己按时跑、出错了去哪找线索。你不需要懂 Java 多线程也不用背 Kafka 协议只要你会在 MySQL 里SELECT * FROM user LIMIT 10;就能今天装好、明天跑通第一个转换。2. 先搞懂一个本质区别为什么“转换Transformation”和“作业Job”不能混着用很多新手第一次打开 KettlePDI拖了“表输入”和“表输出”连上线、点运行——结果报错“找不到驱动”“连接超时”“字段类型不匹配”……不是你手速慢是还没看清这张图的底层逻辑Kettle 不是“顺序执行命令”的脚本工具而是一条并行运转的数据流水线。它默认把每个步骤当成独立工人大家同时开工、各干各的活靠“缓存区”行集传递半成品。这就像一条汽车装配线焊装工、喷漆工、总装工不是等前一个人干完才动手而是每人面前都有个暂存台台满了就停手台空了就等料——这样效率最高但也意味着你不能指望“先删表、再建表、最后插数据”这种强依赖顺序的操作在一个转换里靠连线搞定。2.1 什么是 Transformation转换——专治“数据变形”核心任务对“一行一行的数据”做加工。比如把2024-03-15T08:30:45Z这种字符串转成数据库认的datetime类型把email字段里所有大写字母转小写把order_amount小于 0 的记录直接过滤掉把province_code如BJ通过查字典表补全成province_name如北京市。关键特征所有步骤并发执行你拖的 5 个步骤几乎同时启动数据以“行”为单位流动每行包含若干字段String/Number/Date 等步骤之间用Hop跳连接Hop 是带方向的单向通道背后是内存缓存区默认 50000 行可调一个转换文件后缀是.ktrkettle transformation。提示如果你的任务是“清洗、计算、映射、校验、格式化”那它 99% 属于 Transformation。别硬塞进 Job 里——就像不能让快递员一边打包、一边开车、一边签收合同。2.2 什么是 Job作业——专管“流程调度”核心任务控制“整个任务流”的执行节奏和条件分支。比如先运行一个转换清洗数据成功后再运行另一个转换加载进数仓如果清洗失败发邮件告警并把错误日志存到指定目录每天凌晨 2 点自动触发但只在周一至周五运行同时启动 3 个转换分别处理订单、用户、商品全部成功才算 Job 成功。关键特征步骤是串行或条件执行Job 里的步骤叫 “Job Entry”不是 Transformation 里的 Step不处理“数据行”只处理“成功/失败/跳过”这类状态信号支持邮件、FTP、Shell 脚本、HTTP 请求、等待定时器等“运维级操作”一个作业文件后缀是.kjbkettle job。提示Job 就像车间主任不管焊得漂不漂亮只管“谁该什么时候开工、谁干砸了要扣钱、今天要不要加班”。Transformation 才是焊工本人。2.3 举个真实例子同步聊天记录到星网总来自 PPT 案例PPT 里提到的“同步聊天信息到星网总”这个需求拆解下来其实是典型的Job Transformation 组合拳角色做什么对应 Kettle 组件为什么非它不可Transformation转换从微信接口拉取原始 JSON 日志 → 解析出sender_id,msg_content,send_time→ 过滤掉测试账号消息 → 把send_time字符串转成标准日期 → 补全channel_typewechat字段HTTP ClientJSON InputFilter RowsSelect ValuesAdd Constants需要逐行解析、转换、过滤必须用 Transformation 的数据流能力Job作业每小时触发一次先检查目标表是否存在不存在则建表运行上述转换转换成功后压缩本次日志文件并归档失败则发企业微信告警StartSQLTransformationMove FilesMail需要“先建表再跑转换”这种强顺序且涉及文件、邮件等非数据操作只能用 Job注意这个例子在 PPT 第 18 页有截图。你会发现作业Job画布上只有几个方块Start / SQL / Transformation / Mail而点开那个“Transformation”方块里面才是密密麻麻的步骤连线图——这就是层级关系Job 管流程Transformation 管数据。2.4 新手最常混淆的 3 个点血泪经验现象在 Transformation 里连了“删除表”→“创建表”→“插入数据”结果运行时报错“表不存在”或“表正在被使用”。原因三个步骤并发执行“删除表”还没删完“创建表”就去建了而“插入数据”可能已经冲进去写第一行了。解决把“删表”“建表”放到 Job 里作为 Job 的前序步骤Transformation 只负责“插入数据”。现象用“表输入”读 MySQL字段名显示为col1,col2而不是真实的user_id,user_name。原因Kettle 默认不主动获取元数据字段名、类型尤其当 SQL 里用了SELECT *或子查询时。解决双击“表输入”步骤 → 勾选“执行 SQL 语句前获取字段”Execute SQL before getting fields或手动在“字段”标签页里填好字段名和类型。现象转换里用了“JavaScript 代码”步骤写了var new_date new Date();结果报错ReferenceError: Date is not defined。原因Kettle 内置的 JS 引擎Nashorn不支持完整浏览器 APIDate、JSON、console等都不能直接用。解决改用 Kettle 提供的内置函数比如newdate()获取当前时间str2date()转日期create_date()构造日期对象——这些在“JavaScript 代码”编辑框右上角的“函数”按钮里都能找到。3. 第一步动手5 分钟装好 PDI 9.2启动 UI连上你的 MySQL不装数据库也能练别急着翻 PPT 第 3 页的“安装步骤”我们跳过所有文字描述直接给你一条可复制、可粘贴、零失败的实操路径。你只需要一台 Windows 或 macOS 电脑Linux 同理把.bat换成.sh即可以及一个已有的 MySQL 实例没有后面教你用 Docker 快速起一个30 秒。3.1 下载与解压绿色免安装解压即用打开浏览器访问官方源注意不是百度搜的第三方站https://sourceforge.net/projects/pentaho/files/Pentaho%209.2/client-tools/找到文件名含pdi-ce-9.2.0.0-290.zip的压缩包大小约 700MB点击下载下载完成后右键解压到当前文件夹不要解压到桌面根目录建议新建文件夹如D:\kettle-pdi或~/Downloads/kettle-pdi解压后进入文件夹你会看到一堆.batWindows或.shmacOS/Linux文件——这就是全部。提示PPT 里说的“绿色无需安装”指的就是这个没有注册表、不改系统环境变量、删掉整个文件夹就干净卸载。这也是它适合新手的原因——不怕装错、不怕污染系统。3.2 启动 Spoon图形界面双击就进不是命令行Windows 用户直接双击spoon.bat别点spoonDebug.bat那是给开发人员看日志用的macOS 用户打开终端进入解压目录运行chmod x spoon.sh ./spoon.sh等待 20–40 秒首次启动较慢因要加载插件和图标你会看到一个蓝白相间的窗口弹出标题栏写着“Spoon - Pentaho Data Integration”——这就是 Kettle 的主界面PPT 第 5 页截图就是它。注意如果双击没反应或提示“找不到 Java”说明你电脑没装 JDK 8 或 11PDI 9.2 要求 JDK 8。去 Oracle 或 Adoptium 官网下载安装即可装完重启电脑再试。这是新手唯一可能卡住的前置条件。3.3 连接 MySQL3 步填对比连 Wi-Fi 还简单假设你本地有一个 MySQL账号root密码123456端口3306数据库名test_db。我们来连它在 Spoon 界面顶部菜单栏点击“视图View” → “数据库连接Database Connections”在右侧“数据库连接”面板右键 →“新建连接New Connection”在弹出窗口中按顺序填连接名称随便起比如my_local_mysql后续所有步骤里都用这个名字连接类型下拉选MySQL主机名称填localhost如果是远程库填 IP 或域名数据库名称填test_db端口号填3306用户名填root密码填123456其他选项全不勾尤其别点“使用 SSL”——除非你真配了证书点右下角“测试Test”按钮 → 出现绿色提示“连接成功”→ 点“确定”保存。提示PPT 第 7 页的“数据库连接配置”截图就是这个界面。你会发现它比 Navicat 或 DBeaver 的连接向导还少两步——因为 Kettle 把 JDBC 驱动mysql-connector-java-8.0.28.jar已经自带在lib/目录下了你不用手动下载、复制、粘贴。3.4 没有 MySQL用 Docker 30 秒搭一个附命令如果你电脑没装 MySQL或者不想动本地环境用 Docker 起一个临时库仅用于练习关机就消失# 一行命令拉镜像 启动 暴露 3306 端口 设 root 密码 创建 test_db 库 docker run -d \ --name my-mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e MYSQL_DATABASEtest_db \ -v $(pwd)/mysql-data:/var/lib/mysql \ -d mysql:8.0提示这条命令在 macOS/Linux 终端或 Windows 的 Docker Desktop 里直接运行即可。启动后你就拥有了一个纯净的 MySQL 8.0 实例账号root/123456库test_db端口3306完全匹配上面的连接配置。PPT 里没提 Docker但这招是某导师教 A 同学的“后悔药”——练废了重来30 秒。4. 避坑指南新手跑第一个转换必踩的 5 个坑附定位和修复方法别笑这 5 条全是某开发者就是我第一次用 Kettle 时花 3 小时才搞懂的血泪教训。PPT 里没写但你一定会撞上。4.1 坑一中文乱码——CSV 读出来全是“???”Excel 写进去全是“□□□”现象用“CSV 文件输入”读一个 UTF-8 编码的中文 CSV预览时字段值显示为问号或用“Excel 输出”生成的表格打开后中文变方块。原因Kettle 默认编码是ISO-8859-1西欧字符集不认 UTF-8。这不是 Bug是 Java 早期的遗留设定。解决对“CSV 文件输入”双击步骤 → “内容”标签页 → 找到“编码Encoding”输入框 → 手动填UTF-8注意大小写不能写utf8或utf-8对“Excel 输出”双击步骤 → “内容”标签页 → 同样填UTF-8全局设置推荐在 Spoon 顶部菜单“工具Tools” → “选项Options” → “环境Environment”→ 把 “Default encoding for text files” 改成UTF-8→ 点“确定”。以后所有新步骤默认就是 UTF-8。提示PPT 第 12 页提到“字符编码”但没说具体在哪改。这个坑不填你永远看不到正确的中文。4.2 坑二字段名大小写敏感——MySQL 里user_id和USER_ID是同一个Kettle 里不是现象从 MySQL 读数据字段名是小写的user_id但在“选择值Select Values”步骤里你手输USER_ID去重命名结果运行时报错“字段 USER_ID 不存在”。原因Kettle 内部字段名严格区分大小写且完全继承数据库返回的原始大小写。MySQL 默认不区分但 Kettle 的元数据获取机制会原样保留。解决在“表输入”步骤里点“预览”看实际字段名一定是小写所有后续步骤如“选择值”“字段选择”里必须用预览看到的大小写拼写更稳妥法在“表输入”的 SQL 里用别名统一风格比如SELECT user_id AS user_id, user_name AS user_name FROM user。4.3 坑三日期格式错乱——数据库里2024-03-15Kettle 里变成Mon Mar 15 00:00:00 CST 2024现象从 MySQL 读DATE类型字段预览时显示为长字符串含星期、时区或写入时提示“无法将字符串转为日期”。原因Kettle 的 Date 类型内部是 Java 的java.util.Date显示时用默认格式但存储是毫秒值。你需要显式告诉它“怎么读”和“怎么写”。解决在“表输入”步骤SQL 里别直接SELECT create_date改成SELECT DATE_FORMAT(create_date, %Y-%m-%d) AS create_date_str然后在“字段”标签页里把create_date_str类型设为String或者保持create_date为 Date 类型但在“选择值”步骤里用“元数据Metadata”功能选中字段 → 点“编辑” → 设置“格式”为yyyy-MM-dd注意是小写y和M写入时同理在“表输出”步骤“日期格式”填yyyy-MM-dd。4.4 坑四空值NULL被当成字符串“null”——数据库里明明是 NULLKettle 里变成了字符串 null现象从 MySQL 读一个允许 NULL 的VARCHAR字段预览时看到null带引号而不是空白或写入时null字符串被插进数据库而不是真正的 NULL。原因Kettle 默认把数据库 NULL 映射为字符串null这是为了兼容性避免空指针但不符合直觉。解决在“表输入”步骤 → “内容”标签页 → 勾选“替换 NULL 值Replace null values”在右边“替换为”框里留空什么都不填这样数据库的 NULL 就会变成 Kettle 内部的真正 NULL预览显示为空白写入时也正确。4.5 坑五转换跑一半卡住不动——进度条停在 85%CPU 占用 100%等 10 分钟没反应现象转换里用了“表输入”读百万级数据或“排序”步骤运行后界面卡死日志没报错。原因Kettle 的“排序”“分组”“唯一行”等步骤默认把所有数据加载进内存排序。数据量一大内存爆了就假死。解决首选避免在 Transformation 里做全量排序。用数据库的ORDER BY在“表输入”的 SQL 里完成次选如果必须用 Kettle 排序双击“排序行”步骤 → “内容”标签页 → 勾选“使用外部排序Use external sorting”→ 设置“临时文件目录”确保磁盘有空间通用技巧在转换空白处右键 → “转换属性Transformation properties” → “常规”标签页 → 把“行集大小Rows in rowset”从默认 50000 调小到1000减少内存占用牺牲一点速度。提示这个坑在 PPT 第 15 页“性能调优”里有提但没说“卡住”就是它。记住口诀“排序、分组、唯一三步慎用内存SQL 能干的别让 Kettle 干。”5. 第一个实战3 分钟做出“CSV → 清洗 → Excel”全流程附每步截图逻辑现在我们把前面所有概念串起来做一个 PPT 里第 10 页提到的“快速入门案例”把一份用户 CSV 数据清洗掉空邮箱、统一手机号格式、补全城市名最后导出为 Excel 报表。全程不写一行代码只拖拽、点选、填空。你做完就真正理解了 Kettle 的“数据流”是什么。5.1 准备测试数据一个 5 行的 CSV复制就能用新建一个文本文件命名为users.csv内容如下用记事本或 VS Code 保存为 UTF-8 编码id,name,email,phone,city_code 1,Alice,alicegmail.com,13800138000,BJ 2,Bob,,13900139000,SH 3,Charlie,charlieoutlook.com,13700137000,GZ 4,Dave,daveqq.com,13600136000, 5,Eve,eve163.com,13500135000,SH提示这个 CSV 有典型脏数据第 2 行email为空第 4 行city_code为空phone都是 11 位数字但没加区号或分隔符city_code是缩写需映射为全称。5.2 步骤一拖“CSV 文件输入”——告诉 Kettle 从哪读在 Spoon 主界面点击顶部菜单“文件File” → “新建New” → “转换Transformation”左侧“核心对象Core Objects”面板展开“输入Input”把“CSV 文件输入”拖到画布中央双击该步骤配置文件File点“浏览”找到你刚保存的users.csv内容Content勾选“首行包含字段名Header”“分隔符Delimiter”填,“编码Encoding”填UTF-8避坑指南第一条字段Fields点右下角“获取字段”Get Fields按钮 → 自动识别出 5 个字段确认后点“确定”。逻辑说明这一步只是“声明”数据源不真正读取。Kettle 的设计哲学是“声明式”所有步骤都是蓝图运行时才干活。5.3 步骤二拖“过滤行”——筛掉空邮箱从“核心对象”→“流程Flow”拖一个“过滤行Filter rows”到画布放在 CSV 步骤右侧用鼠标左键从 CSV 步骤的右端出现小箭头拖到“过滤行”左端连一条 Hop跳双击“过滤行”配置过滤条件Condition点“新建” → 左边字段选email中间选IS NOT NULL右边留空发送到Send to“true”分支满足条件→ 命名为valid_email“false”分支不满足→ 命名为invalid_email我们先不管它后续可加日志点“确定”。参数说明IS NOT NULL是 Kettle 内置条件比写email 更安全因它同时过滤NULL和空字符串。valid_email是分支名后续连线要用。5.4 步骤三拖“JavaScript 代码”——统一手机号、补全城市从“核心对象”→“脚本Scripting”拖一个“JavaScript 代码JavaScript code”到画布放在“过滤行”的valid_email分支右侧用 Hop 连接valid_email→ JavaScript 步骤双击 JavaScript 步骤重点填“脚本Script”框别动其他默认项// 1. 统一手机号11位数字转成 138-0013-8000 格式 if (phone ! null phone.length 11 isNumber(phone)) { var p phone ; phone p.substring(0,3) - p.substring(3,7) - p.substring(7,11); } // 2. 补全城市名city_code - city_name if (city_code BJ) { city_name 北京市; } else if (city_code SH) { city_name 上海市; } else if (city_code GZ) { city_name 广州市; } else { city_name 未知城市; }逻辑说明这段 JS 不是浏览器 JS是 Kettle 的 Nashorn 引擎。phone、city_code是输入字段名直接可用city_name是新字段赋值后自动加入数据流isNumber()是内置函数判断是否为数字。PPT 第 13 页的“JS 脚本”示例就是这个逻辑。5.5 步骤四拖“Excel 输出”——导出结果从“核心对象”→“输出Output”拖一个“Excel 输出Excel output”到画布放在 JavaScript 步骤右侧Hop 连接 JavaScript → Excel 输出双击 Excel 输出配置文件File点“浏览”选保存路径填cleaned_users.xlsx内容Content“编码Encoding”填UTF-8“工作表名称Sheet name”填users字段Fields点“获取字段” → 自动列出id,name,email,phone,city_code,city_name确认后点“确定”。5.6 运行与验证点绿色三角3 秒出 Excel点击顶部工具栏绿色三角形“运行Run”按钮弹出“运行转换”窗口点“执行Execute”看底部“执行结果Execution results”面板如果显示转换结束Finished且读取行数Read 4因第 2 行被过滤写入行数Written 4说明成功打开生成的cleaned_users.xlsx你应该看到idnameemailphonecity_codecity_name1Alicealicegmail.com138-0013-8000BJ北京市3Charliecharlieoutlook.com137-0013-7000GZ广州市4Davedaveqq.com136-0013-6000未知城市5Eveeve163.com135-0013-5000SH上海市提示第 4 行city_code为空所以city_name是“未知城市”——这正是我们 JS 逻辑写的。你已经完成了 ETL 的核心闭环ExtractCSV→ Transform过滤JS→ LoadExcel。6. 下一步学什么从“能跑通”到“敢上线”的 4 个进阶台阶附学习资源锚点你现在已经能装、能连、能拖、能跑通第一个转换。但真实项目不会让你只导 Excel它会问“每天凌晨 2 点自动跑失败发钉钉”“数据量从 1 万涨到 100 万怎么不卡”“老板要加个新字段怎么不影响线上”——这些问题就是从“会用”到“敢扛事”的分水岭。下面这 4 个台阶是我带 A 同学从零到独立负责数据同步模块的真实路径每一步都对应 PPT 里的具体页码和可练的点。6.1 台阶一把“手动点运行”变成“自动定时跑”Job Carte你现在点一次绿色三角只跑一次。生产环境要的是“每天固定时间、自动、可靠、可监控”。这就必须用Job作业 Carte轻量级服务。怎么做新建一个 Job文件 → 新建 → 作业拖一个“转换Transformation”入口不是 Transformation 本身是 Job 里的 Entry配置它指向你刚做的csv_to_excel.ktr文件再拖一个“邮件Mail”Entry配置 SMTP如 QQ 邮箱的 smtp.qq.com:587用 Job 的“成功”“失败”跳把转换成功连到“发成功邮件”失败连到“发失败邮件”保存为daily_clean_job.kjb打开终端进入 Kettle 目录运行# 启动 Carte 服务默认端口 8080 carte.bat # Windows # 或 ./carte.sh # macOS/Linux浏览器打开http://localhost:8080上传daily_clean_job.kjb点“执行”再用kitchen.bat命令行调用适合加到系统定时任务kitchen.bat /file:D:\kettle-pdi\daily_clean_job.kjb /level:BasicPPT 锚点第 16 页“作业调度”、第 17 页“Carte 集群”为什么重要这是你脱离“手工操作”的第一步。上线后你再也不用守着电脑点运行而是看邮件收报告。6.2 台阶二让“单机跑”变成“多线程并发跑”分区 并行转换你现在的转换是单线程读 CSV。如果数据量涨到 100 万行可能要 5 分钟。用分区Partitioning可以把它切成 4 份4 个线程同时跑2 分钟搞定。怎么做在你的csv_to_excel.ktr转换里右键空白处 → “转换属性” → “分区”标签页勾选“启用分区Enable partitioning”分区方案选“哈希分区Hash partitioning”点“添加分区” → 字段选id数值型分布均匀分区数填4保存重新运行——你会看到日志里出现Thread-1,Thread-2… 并发执行PPT 锚点第 14 页“并行处理”、第 15 页“性能调优”为什么重要这是 Kettle 最被低估的能力。很多新人以为“ETL 就是慢”其实是没开分区。某跨平台系统用这招把日志同步从 40 分钟压到 6 分钟。6.3 台阶三把“裸奔转换”变成“带监控和回滚”日志 事务现在转换失败你只能看控制台一堆英文。生产环境要的是“哪里错了影响多少行能一键撤回吗”怎么做在转换里拖本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站