本篇是第 9 章第 1 节,落地起点,讲如何把在 Spoon 里画好的东西稳稳跑在生产。
生产部署第一原则是「环境一致」。我们容器化 Kettle,开发、测试、生产用同一镜像,区别仅在注入的变量文件。这样「我本地能跑」不再是借口,环境漂移导致的故障大幅下降。
执行方式上,生产一律用 Pan/Kitchen 命令行,由调度系统(如 Airflow、 cron、控制塔)触发,不在服务器开 Spoon 手点。手点不可审计、不可重建,前面 7.3 已强调,这里落到部署形态上就是「无头执行」。
资源隔离:给 Pan 固定堆、给 Carte 独立机器,避免和别的进程抢资源。我们按数据体积分档起容器,小转换小容器、大转换大容器,资源利用率和稳定性兼顾。
配置外置:连接、参数、密文全走变量与配置中心,镜像里不含任何环境值。这样同一份制品能发布到任意环境,部署就是「选变量文件+启动」,简单且不易错。
高可用方面,单机 Pan 挂了由调度重试;Carte 集群挂单点不影响整体,主节点可用多实例+健康检查。我们对关键作业设调度级重试与超时,单点故障不升级成业务中断。
下面这段 bash 给出了可直接落地的配置,输入来自上一步、输出写入目标端:
# 容器化启动生产转换(无头、变量外置) docker run --rm \ -e ENV=prod \ -v /etc/kettle/prod.properties:/kettle/.kettle/kettle.properties \ kettle:9.4 pan.sh /file:/jobs/orders.ktr -param:p_day=${day}
同一镜像,靠挂载不同 properties 适配环境。我们生产部署只有这一种姿势,杜绝手改。
# 调度系统触发(示例 cron) 30 2 * * * /opt/kettle/run_job.sh nightly.kjb 2026-08-25 # run_job.sh 内部调用 Kitchen,退出码非0则告警
调度只认退出码。我们所有生产触发都经调度,绝不在服务器手动点运行,状态才可追溯。
开发库字段名是 create_time,生产是 created_at,本地跑通的转换在生产取空,空跑一整夜。
改用统一镜像,连接与字段映射全部变量化、由配置中心按环境注入,开发即对标生产。
# prod.properties SRC_TABLE=orders TS_COL=created_at # dev.properties SRC_TABLE=orders TS_COL=create_time
环境差异被变量吸收,开发对标生产,同类空跑不再发生。
根因是「两套装真相」。部署铁律是单一制品+变量分流,环境差异必须显式、集中管理。
更稳是把生产库结构也纳入 schema 校验(见 5.2),字段改名时 CI 就拦下,不等到生产才爆。
误区:生产开 Spoon 手点。必须无头执行,经调度触发。
误区:镜像含环境值。配置全外置,单一制品多环境。
取舍:固定堆+独立 Carte;关键作业调度级重试与超时。

开发在 Spoon 里画好,生产不能依赖 GUI。标准做法是:元数据(.ktr/.kjb)通过 CI/CD 同步到生产机的固定目录或资源库;运行时用 Kitchen/Pan 由调度系统(cron/Airflow/专业调度)触发;凭据、路径、环境通过变量在启动时注入,绝不写死。环境间差异(时区、路径根、库地址)用 ${p_env} 等变量吸收,做到「同一套文件跨环境零修改」。还要有回滚预案:保留上一版元数据,出问题一键切回。
# 生产启动作业(输入:资源库/目录里的 .kjb + 变量;输出:执行结果+日志落盘) kitchen.sh /file:/opt/etl/jobs/orders_pipeline.kjb \ -param:p_day=2026-08-25 -param:p_env=prod \ -logfile:/var/log/etl/orders_$(date +%F).log # 调度系统按退出码判成败;日志落盘是事后排错的依据,务必保留足够天数
| 要素 | 做法 |
|---|---|
| 元数据 | CI/CD 同步 |
| 运行时 | 调度触发 |
| 差异 | 变量吸收 |
在 Spoon 里跑生产,行为与服务器不一致。
元数据走 CI/CD 同步,Kitchen 由调度触发,变量启动注入。
kitchen.sh /file:/opt/etl/jobs/orders_pipeline.kjb \ -param:p_day=2026-08-25 -param:p_env=prod \ -logfile:/var/log/etl/orders_$(date +%F).log
同一套文件跨环境零修改运行,日志可回溯。
部署本质是环境差异变量化。
保留上一版元数据,出问题一键切回。
部署记住一句话:「环境差异变量化,文件一次写好到处跑」。路径、凭据、时区、库地址全部抽成变量,在启动时注入,绝不写死。日志落盘并留存足够天数,它是生产环境的黑匣子,出问题先翻它再翻代码。
补充一点:日志不仅要及时落盘,还要保留足够天数(建议不少于 30 天)并能被集中检索。生产排错经常要对比「上周同日的运行」,没有历史日志就只能盲猜。日志策略应作为部署清单的一项,与凭据、路径同等对待。