外观
空跑 / 静默失败检出
难度与前置
难度:进阶
前置:调度显示成功/失败;能查分区行数与水位/进度指标;有基础量级或新鲜度告警。
读完能做什么:识别「任务绿、数据空/错」的几类静默失败,用检出清单与首响步骤处理,并用检出率与 MTTD 验收。
适用场景
- 调度全绿,业务却说看板为零或昨同比断裂
- 过滤条件、配置开关、分区通配导致写入 0 行但 exit 0
- 流作业水位卡住或闲置,无失败事件故无告警
- 补数/重跑跳过已有分区,表面成功实则未刷到
不适用:
- 量级阈值与基线怎么定(见 volume-monitor、anomaly-baseline)
- 对账规则设计全文(见 reconciliation;差异出现后分流见 recon-triage)
- 完整事故复盘模板(见 incident-postmortem)
- 优先级抢占导致的失败态(见 priority-preempt-drill;若失败态丢失则归本篇)
真实场景(一条)
短剧投放日批 dwd_ad_event 调度成功。配置中心把实验过滤写成 app_id IN ()(空列表),引擎语义为「恒假」,写入 0 行,作业仍 exit 0。新鲜度「分区存在」也绿(空分区已创建)。直到看板消耗为 0 才发现。
按本清单:成功 ≠ 有数 → 零行/同比跌零告警 → 首响区分过滤吞数 vs 源空窗 vs 跳过分区 → 修复后 MTTD 从「业务发现 ~6h」降到「自动告警 <15min」,观察 30 天空跑对外事故 0。
怎么做(步骤清单)
1. 静默失败分类(先对号)
| 类型 | 信号 | 典型根因 |
|---|---|---|
| 零行成功 | exit 0;输出分区行数 = 0 | 过滤恒假、源空、写路径错 |
| 过滤吞数 | 行数远低于基线但非 0 | 错误 where、错误字典、权限视图 |
| 跳过分区 | 任务成功;目标 dt 未写入或 mtime 旧 | 依赖误判已完成、补数 skip 已存在 |
| 水位停滞 | 作业 RUNNING/IDLE;事件时间不推进 | 源停、idle 无告警、脏时钟 |
| 错数成功 | 行数正常;关键度量离谱 | 口径开关、Join 丢边、单位错误 |
口诀:调度成功只证明进程退出码;数据合同要另开验收。
2. 检出清单(监控侧,可复制)
text
静默失败检出清单
□ 成功实例必须上报:输出行数、字节量、分区列表
□ 零行:P0/P1 表零行 = 告警(允许名单:合法空窗日需标注)
□ 同比/基线:|今日行数/基线-1| 超阈 → 告警(链 anomaly-baseline)
□ 分区覆盖:期望 dt 集合 vs 实际写入;跳过要显式状态码
□ 新鲜度:最大事件时间/分区封闭(链 freshness-sla);空分区不算达标
□ 流作业:watermark 滞后、idle 超时告警;禁止「无 checkpoint 失败=健康」
□ 主键/度量抽检:日级 checksum 或对账(链 reconciliation)
□ 配置变更:过滤条件变更进变更窗并触发样例回归3. 首响 20 分钟(值班)
text
静默失败 · 首 20 分钟
T+0 现象:□零行 □跌零/腰斩 □分区缺 □水位停 □错数
T+5 调度:实例终态 ____ 退出码 ____ 是否「跳过」态 ____
T+8 量级:行数 ____ vs 基线 ____(volume-monitor)
T+10 新鲜度:源封闭?Y/N 空分区?Y/N(freshness-sla)
T+12 过滤/配置:最近变更?Y/N 实验开关?____
T+15 是否对外不可信:□是(公告+阻断 ADS)□否 □观察
T+20 唯一下一步:________ 问题单:________(closed-loop)分流提示:
- 像对账 diff → 交 recon-triage,但先标「可能空跑」
- 确认空跑/错数已对外 → 升级真警与复盘,不按「抖动」关单
- 告警路由见 alert-oncall
4. 防再发(工程最小集)
| 手段 | 说明 |
|---|---|
| 成功契约 | 绿必须带行数/字节指标;缺指标视同失败 |
| 空分区 ≠ 就绪 | READY 规则与 dependency 对齐 |
| 合法空窗日 | 日历标注(大促停投等),否则零行即警 |
| 配置即代码 | 过滤变更走 PR + test-fixture |
| 闭环 | 原因码含「空跑/静默」;复验看 MTTD |
常见坑(至少这些)
相信调度绿灯等于数据就绪
空分区创建成功,新鲜度也标达标
零行白名单过大,真空跑被吞
只告失败态,不告「成功但 0 行」
水位不动却无 idle 告警,流任务假健康
跳过分区无状态码,补数以为刷过
跌零当「业务没投放」不核源
先核源与过滤变更。检出后不进 closed-loop,下周同样空跑
如何验收(带数字的前后对比)
| 项 | 改前(示例) | 改后(目标) |
|---|---|---|
| P0 表零行/跳过检出 | 靠业务发现 | 自动告警;MTTD ≤ 15min |
| 成功实例缺行数指标 | 常见 | 0(缺则失败) |
| 空跑对外事故(30 天) | ≥1 | 0 |
| 合法空窗误报 | 高 | 有日历;误报可解释 |
| 静默类问题单含原因码与复验 | 无 | 100% |
text
空跑/静默失败验收(可复制)
范围:P0/P1 作业 ____ 个
成功必带行数指标:____%
演练:故意零行过滤 → 告警是否 <15min:Y/N
观察期空跑对外:____(期望 0)
抽检水位 idle 告警:Y/N
签字(质量/值班):________ 日期:________Checklist:
- [ ] 分类表 + 检出清单 + 首 20 分钟可执行
- [ ] 链到 volume-monitor / freshness-sla / closed-loop / recon-triage / alert-oncall / anomaly-baseline
- [ ] 验收含 MTTD 与空跑事故数字
- [ ] 无假外链;无未公开阈值当机密泄露
相关专篇(互链,不重写)
| 你要做的事 | 看哪篇 |
|---|---|
| 行数/字节告警 | 行数/字节量监控 |
| 封闭与 SLA | 新鲜度 SLA |
| 问题单认领复验 | 质量闭环 |
| 差异分流 | 对账失败分诊 |
| 接警升级 | 告警与值班 |
| 波动阈值 | 波动基线 |
| 本篇 | 只做空跑/静默检出与首响,不替代量级/对账设计 |
相关面试题
题库小程序链接待定;先用站内锚点占位。
- [ ] 题:列举至少四类静默失败,并说明为何「调度成功」不够?(考察点:分类表)→ 占位:
#todo-interview-silent-failure-types - [ ] 题:零行成功如何在 15 分钟内被检出?验收看哪些数字?(考察点:MTTD + 行数指标)→ 占位:
#todo-interview-silent-failure-zero-row - [ ] 题:空分区为何不能算新鲜度达标?与 dependency READY 如何对齐?(考察点:空分区陷阱)→ 占位:
#todo-interview-silent-failure-empty-part - [ ] 题:首 20 分钟清单如何决定是否阻断 ADS?(考察点:对外不可信)→ 占位:
#todo-interview-silent-failure-block