ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

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

简介:本资源是一份面向1–3年经验研发人员的Kettle(Pentaho 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)”不能混着用?

很多新手第一次打开 Kettle(PDI),拖了“表输入”和“表输出”,连上线、点运行——结果报错:“找不到驱动”“连接超时”“字段类型不匹配”……
不是你手速慢,是还没看清这张图的底层逻辑:

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 行,可调);
    • 一个转换文件后缀是.ktr(kettle transformation)。

提示:如果你的任务是“清洗、计算、映射、校验、格式化”,那它 99% 属于 Transformation。别硬塞进 Job 里——就像不能让快递员一边打包、一边开车、一边签收合同。

2.2 什么是 Job(作业)?——专管“流程调度”

  • 核心任务:控制“整个任务流”的执行节奏和条件分支。比如:
    • 先运行一个转换(清洗数据),成功后再运行另一个转换(加载进数仓);
    • 如果清洗失败,发邮件告警,并把错误日志存到指定目录;
    • 每天凌晨 2 点自动触发,但只在周一至周五运行;
    • 同时启动 3 个转换(分别处理订单、用户、商品),全部成功才算 Job 成功。
  • 关键特征:
    • 步骤是串行或条件执行(Job 里的步骤叫 “Job Entry”,不是 Transformation 里的 Step);
    • 不处理“数据行”,只处理“成功/失败/跳过”这类状态信号;
    • 支持邮件、FTP、Shell 脚本、HTTP 请求、等待定时器等“运维级操作”;
    • 一个作业文件后缀是.kjb(kettle job)。

提示:Job 就像车间主任,不管焊得漂不漂亮,只管“谁该什么时候开工、谁干砸了要扣钱、今天要不要加班”。Transformation 才是焊工本人。

2.3 举个真实例子:同步聊天记录到星网总(来自 PPT 案例)

PPT 里提到的“同步聊天信息到星网总”这个需求,拆解下来其实是典型的Job + Transformation 组合拳:

角色做什么对应 Kettle 组件为什么非它不可
Transformation(转换)从微信接口拉取原始 JSON 日志 → 解析出sender_id,msg_content,send_time→ 过滤掉测试账号消息 → 把send_time字符串转成标准日期 → 补全channel_type='wechat'字段HTTP Client+JSON Input+Filter Rows+Select Values+Add Constants需要逐行解析、转换、过滤,必须用 Transformation 的数据流能力
Job(作业)每小时触发一次;先检查目标表是否存在,不存在则建表;运行上述转换;转换成功后,压缩本次日志文件并归档;失败则发企业微信告警Start+SQL+Transformation+Move Files+Mail需要“先建表再跑转换”这种强顺序,且涉及文件、邮件等非数据操作,只能用 Job

注意:这个例子在 PPT 第 18 页有截图。你会发现:作业(Job)画布上只有几个方块(Start / SQL / Transformation / Mail),而点开那个“Transformation”方块,里面才是密密麻麻的步骤连线图——这就是层级关系:Job 管流程,Transformation 管数据。

2.4 新手最常混淆的 3 个点(血泪经验)

  1. 现象:在 Transformation 里连了“删除表”→“创建表”→“插入数据”,结果运行时报错“表不存在”或“表正在被使用”。
    原因:三个步骤并发执行!“删除表”还没删完,“创建表”就去建了,而“插入数据”可能已经冲进去写第一行了。
    解决:把“删表”“建表”放到 Job 里,作为 Job 的前序步骤;Transformation 只负责“插入数据”。

  2. 现象:用“表输入”读 MySQL,字段名显示为col1,col2,而不是真实的user_id,user_name。
    原因:Kettle 默认不主动获取元数据(字段名、类型),尤其当 SQL 里用了SELECT *或子查询时。
    解决:双击“表输入”步骤 → 勾选“执行 SQL 语句前获取字段”(Execute SQL before getting fields),或手动在“字段”标签页里填好字段名和类型。

  3. 现象:转换里用了“JavaScript 代码”步骤,写了var new_date = new Date();,结果报错ReferenceError: "Date" is not defined。
    原因:Kettle 内置的 JS 引擎(Nashorn)不支持完整浏览器 API,Date、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 下载与解压:绿色免安装,解压即用

  1. 打开浏览器,访问官方源(注意:不是百度搜的第三方站):
    https://sourceforge.net/projects/pentaho/files/Pentaho%209.2/client-tools/
  2. 找到文件名含pdi-ce-9.2.0.0-290.zip的压缩包(大小约 700MB),点击下载;
  3. 下载完成后,右键解压到当前文件夹(不要解压到桌面根目录!建议新建文件夹如D:\kettle-pdi或~/Downloads/kettle-pdi);
  4. 解压后,进入文件夹,你会看到一堆.bat(Windows)或.sh(macOS/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 或 11(PDI 9.2 要求 JDK 8+)。去 Oracle 或 Adoptium 官网下载安装即可,装完重启电脑再试。这是新手唯一可能卡住的前置条件。

3.3 连接 MySQL:3 步填对,比连 Wi-Fi 还简单

假设你本地有一个 MySQL,账号root,密码123456,端口3306,数据库名test_db。我们来连它:

  1. 在 Spoon 界面顶部菜单栏,点击“视图(View)” → “数据库连接(Database Connections)”;
  2. 在右侧“数据库连接”面板,右键 →“新建连接(New Connection)”;
  3. 在弹出窗口中,按顺序填:
    • 连接名称:随便起,比如my_local_mysql(后续所有步骤里都用这个名字);
    • 连接类型:下拉选MySQL;
    • 主机名称:填localhost(如果是远程库,填 IP 或域名);
    • 数据库名称:填test_db;
    • 端口号:填3306;
    • 用户名:填root;
    • 密码:填123456;
    • 其他选项全不勾(尤其别点“使用 SSL”——除非你真配了证书);
  4. 点右下角“测试(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_PASSWORD=123456 \ -e MYSQL_DATABASE=test_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-15,Kettle 里变成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”——数据库里明明是 NULL,Kettle 里变成了字符串 "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,alice@gmail.com,13800138000,BJ 2,Bob,,13900139000,SH 3,Charlie,charlie@outlook.com,13700137000,GZ 4,Dave,dave@qq.com,13600136000, 5,Eve,eve@163.com,13500135000,SH

提示:这个 CSV 有典型脏数据:第 2 行email为空;第 4 行city_code为空;phone都是 11 位数字,但没加区号或分隔符;city_code是缩写,需映射为全称。

5.2 步骤一:拖“CSV 文件输入”——告诉 Kettle 从哪读

  1. 在 Spoon 主界面,点击顶部菜单“文件(File)” → “新建(New)” → “转换(Transformation)”;
  2. 左侧“核心对象(Core Objects)”面板,展开“输入(Input)”,把“CSV 文件输入”拖到画布中央;
  3. 双击该步骤,配置:
    • 文件(File):点“浏览”找到你刚保存的users.csv;
    • 内容(Content):
      • 勾选“首行包含字段名(Header)”;
      • “分隔符(Delimiter)”填,;
      • “编码(Encoding)”填UTF-8(避坑指南第一条!);
    • 字段(Fields):点右下角“获取字段”(Get Fields)按钮 → 自动识别出 5 个字段;
    • 确认后点“确定”。

逻辑说明:这一步只是“声明”数据源,不真正读取。Kettle 的设计哲学是“声明式”,所有步骤都是蓝图,运行时才干活。

5.3 步骤二:拖“过滤行”——筛掉空邮箱

  1. 从“核心对象”→“流程(Flow)”,拖一个“过滤行(Filter rows)”到画布,放在 CSV 步骤右侧;
  2. 用鼠标左键,从 CSV 步骤的右端(出现小箭头)拖到“过滤行”左端,连一条 Hop(跳);
  3. 双击“过滤行”,配置:
    • 过滤条件(Condition):点“新建” → 左边字段选email,中间选IS NOT NULL,右边留空;
    • 发送到(Send to):
      • “true”分支(满足条件)→ 命名为valid_email;
      • “false”分支(不满足)→ 命名为invalid_email(我们先不管它,后续可加日志);
  4. 点“确定”。

参数说明:IS NOT NULL是 Kettle 内置条件,比写email <> ''更安全,因它同时过滤NULL和空字符串。valid_email是分支名,后续连线要用。

5.4 步骤三:拖“JavaScript 代码”——统一手机号、补全城市

  1. 从“核心对象”→“脚本(Scripting)”,拖一个“JavaScript 代码(JavaScript code)”到画布,放在“过滤行”的valid_email分支右侧;
  2. 用 Hop 连接valid_email→ JavaScript 步骤;
  3. 双击 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 输出”——导出结果

  1. 从“核心对象”→“输出(Output)”,拖一个“Excel 输出(Excel output)”到画布,放在 JavaScript 步骤右侧;
  2. Hop 连接 JavaScript → Excel 输出;
  3. 双击 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

  1. 点击顶部工具栏绿色三角形“运行(Run)”按钮;
  2. 弹出“运行转换”窗口,点“执行(Execute)”;
  3. 看底部“执行结果(Execution results)”面板:
    • 如果显示转换结束(Finished),且读取行数(Read)= 4(因第 2 行被过滤),写入行数(Written)= 4,说明成功;
  4. 打开生成的cleaned_users.xlsx,你应该看到:
idnameemailphonecity_codecity_name
1Alicealice@gmail.com138-0013-8000BJ北京市
3Charliecharlie@outlook.com137-0013-7000GZ广州市
4Davedave@qq.com136-0013-6000未知城市
5Eveeve@163.com135-0013-5000SH上海市

提示:第 4 行city_code为空,所以city_name是“未知城市”——这正是我们 JS 逻辑写的。你已经完成了 ETL 的核心闭环:Extract(CSV)→ Transform(过滤+JS)→ Load(Excel)。


6. 下一步学什么?从“能跑通”到“敢上线”的 4 个进阶台阶(附学习资源锚点)

你现在已经能装、能连、能拖、能跑通第一个转换。但真实项目不会让你只导 Excel,它会问:“每天凌晨 2 点自动跑,失败发钉钉?”“数据量从 1 万涨到 100 万,怎么不卡?”“老板要加个新字段,怎么不影响线上?”——这些问题,就是从“会用”到“敢扛事”的分水岭。下面这 4 个台阶,是我带 A 同学从零到独立负责数据同步模块的真实路径,每一步都对应 PPT 里的具体页码和可练的点。

6.1 台阶一:把“手动点运行”变成“自动定时跑”(Job + Carte)

你现在点一次绿色三角,只跑一次。生产环境要的是“每天固定时间、自动、可靠、可监控”。这就必须用Job(作业) + Carte(轻量级服务)。

  • 怎么做:
    1. 新建一个 Job(文件 → 新建 → 作业);
    2. 拖一个“转换(Transformation)”入口(不是 Transformation 本身,是 Job 里的 Entry);
    3. 配置它指向你刚做的csv_to_excel.ktr文件;
    4. 再拖一个“邮件(Mail)”Entry,配置 SMTP(如 QQ 邮箱的 smtp.qq.com:587);
    5. 用 Job 的“成功”“失败”跳,把转换成功连到“发成功邮件”,失败连到“发失败邮件”;
    6. 保存为daily_clean_job.kjb;
    7. 打开终端,进入 Kettle 目录,运行:
      # 启动 Carte 服务(默认端口 8080) carte.bat # Windows # 或 ./carte.sh # macOS/Linux
    8. 浏览器打开http://localhost:8080,上传daily_clean_job.kjb,点“执行”;
    9. 再用kitchen.bat命令行调用(适合加到系统定时任务):
      kitchen.bat /file:"D:\kettle-pdi\daily_clean_job.kjb" /level:Basic
  • PPT 锚点:第 16 页“作业调度”、第 17 页“Carte 集群”;
  • 为什么重要:这是你脱离“手工操作”的第一步。上线后,你再也不用守着电脑点运行,而是看邮件收报告。

6.2 台阶二:让“单机跑”变成“多线程并发跑”(分区 & 并行转换)

你现在的转换是单线程读 CSV。如果数据量涨到 100 万行,可能要 5 分钟。用分区(Partitioning),可以把它切成 4 份,4 个线程同时跑,2 分钟搞定。

  • 怎么做:
    1. 在你的csv_to_excel.ktr转换里,右键空白处 → “转换属性” → “分区”标签页;
    2. 勾选“启用分区(Enable partitioning)”,分区方案选“哈希分区(Hash partitioning)”;
    3. 点“添加分区” → 字段选id(数值型,分布均匀),分区数填4;
    4. 保存,重新运行——你会看到日志里出现Thread-1,Thread-2… 并发执行;
  • PPT 锚点:第 14 页“并行处理”、第 15 页“性能调优”;
  • 为什么重要:这是 Kettle 最被低估的能力。很多新人以为“ETL 就是慢”,其实是没开分区。某跨平台系统用这招,把日志同步从 40 分钟压到 6 分钟。

6.3 台阶三:把“裸奔转换”变成“带监控和回滚”(日志 + 事务)

现在转换失败,你只能看控制台一堆英文。生产环境要的是“哪里错了?影响多少行?能一键撤回吗?”

  • 怎么做:
    1. 在转换里,拖

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进