目标
夜间 ETL 有三种安静的死法:挂住不动、干净退出但只做了一半、或者全速处理错数据。心跳抓挂死、完成门禁抓半程、量级带宽抓坏数据——简单的一封成功邮件对这三种全都视而不见。
步骤要点
- 每个阶段发心跳:行数、字节数、耗时实时上报监控系统,挂死表现为心跳停止而不是到点才发现。
- 设完成门禁:跑完校验所有阶段确实执行、完成标记已写、水位已推进,跳阶段的“绿色退出”也会报警。
- 加量级带宽:行数字节量对照历史区间(考虑周内与季节性),越界即告警。
- 区分打页与噪音:硬失败与超时进寻呼,量级异常进早间摘要供分诊,值班能睡整觉。
- 下游首个消费者核验新鲜度与行数,捕捉作业自身看不到的损坏。
排错提示
作业退出码零但报表缺数据是完成门禁缺失,门禁要查产物存在性而非退出码;量级异常半夜打页说明分级错了,带宽越界进摘要、失败才进寻呼;挂死要等到早上才发现是心跳没接监控,把阶段心跳变成可告警指标。
适用边界
量级带宽依赖稳定的历史模式,业务结构性变化(新品类、新市场)会触发误报需重校准;下游核验只能覆盖第一个消费者,深层衍生层要靠对账流程。
代码示例
nightly_orders ETL (00:30Z)
heartbeats: extract 00:31 (2.1M rows)
transform 00:34 (2.1M in, 2.0M out)
load 00:39 (2.0M upserted)
DONE marker 00:41 watermark 10-21
checks:
completion gate PASS (all stages + marker)
volume band 2.0M vs [1.8M, 2.3M] PASS
downstream dashboard fresh 00:42 PASS
anomaly example (caught):
transform out 0.9M (55% of band) -> morning digest
cause: upstream partial outage 10-21 21:40Z