外观
行数/字节量监控与告警
难度与前置
难度:进阶
前置:会查分区行数/路径体积;知道业务有星期效应。
读完能做什么:为关键表建立量级监控与告警阈值,和调度、对账联动,早发现空分区、爆量与静默丢数。
适用场景
- 任务绿勾但下游发现空表 / 少一半
- 某日分区暴增导致成本与作业打爆
- 需要「量级」类 DQ:行数、字节、文件数
- 与新鲜度、波动基线组成质量三件套
不适用:
- 替代字段级准确性校验(仍要对账与规则)
- 无业务日历的绝对值硬阈(必误报)
- 未建分区的糊涂账大表(先分区,见 分区策略)
真实场景(一条)
营销事件表某日上游开关故障,写出空分区,调度成功。次日午间报表全零才发现。治理:分区行数与字节量在 SLA 点前校验;相对「同比星期」基线跌破 30% 阻断下游;字节量暴涨 5 倍告警。空分区在凌晨被拦住,未污染 ADS。
怎么做(步骤清单)
1. 监控对象分层
| 对象 | 指标 | 用途 |
|---|---|---|
| 表分区 | row_cnt, size_bytes, file_cnt | 空分区/爆量 |
| 作业输出 | 写出行数、拒绝行数 | 与上游对比 |
| Topic/流 | 日消息量 | 实时链路 |
| 小文件 | file_cnt / row_cnt | 治理触发 |
2. 采集方式(示意)
sql
-- 引擎统计(Hive/Spark 示意,注意统计信息是否新鲜)
ANALYZE TABLE dwd_event_di PARTITION (dt='${biz_date}') COMPUTE STATISTICS;
SHOW PARTITIONS dwd_event_di PARTITION (dt='${biz_date}');
SELECT
'${biz_date}' AS dt,
COUNT(*) AS row_cnt
FROM dwd_event_di
WHERE dt = '${biz_date}';bash
# 存储体积
hdfs dfs -du -s /warehouse/dwd_event_di/dt=${biz_date}
# 输出:bytes path写入质量元表:dq_volume_daily(table_name, dt, row_cnt, size_bytes, file_cnt, collected_at)。
3. 基线:别用死数字
与 波动基线 一致:
text
常用比较:
- vs 昨天
- vs 上周同星期
- vs 近 7 日中位数
阈值示例(按表标定):
- 跌破 median * 0.7 → 告警
- 跌破 median * 0.3 或 row_cnt=0 → 阻断
- 超过 median * 3 → 爆量告警(成本/倾斜)sql
SELECT
t.dt,
t.row_cnt,
m.median_7d,
t.row_cnt * 1.0 / NULLIF(m.median_7d, 0) AS ratio
FROM dq_volume_daily t
JOIN (
SELECT approx_percentile(row_cnt, 0.5) AS median_7d -- 或中位数实现
FROM dq_volume_daily
WHERE table_name = 'dwd_event_di'
AND dt BETWEEN date_sub('${biz_date}', 7) AND date_sub('${biz_date}', 1)
) m ON 1=1
WHERE t.table_name = 'dwd_event_di' AND t.dt = '${biz_date}';4. 与调度联动门禁
text
任务成功
→ 采集 volume
→ 规则:empty / drop / spike
→ PASS:触发下游
→ FAIL:阻断 + 告警值班(见 [告警值班](/schedule/alert-oncall))空分区对「允许为空」的表(如新业务)要白名单,避免误杀。
5. 行数 vs 字节量一起看
| 现象 | 可能原因 |
|---|---|
| 行空、字节空 | 未写/路径错 |
| 行空、字节不空 | 只有成功标记文件或写坏 |
| 行涨、字节暴涨 | 宽列/膨胀/格式变 |
| 行涨、字节微涨 | 正常或压缩变好 |
| 文件数暴涨 | 小文件(见 小文件) |
6. 流式 / 分钟级量级
sql
-- 每 5 分钟消息量入监控表
SELECT window_start, COUNT(*) AS cnt
FROM events
GROUP BY window_start;告警:连续 N 个窗口为 0;或相对同时段基线跌破。与 新鲜度 互补:有量但过期 vs 无量。
7. 告警分级与认领
| 级别 | 条件 | 动作 |
|---|---|---|
| P0 | 核心表空分区 / 跌破阻断阈 | 阻断下游、叫人 |
| P1 | 显著下跌未空 | 告警,可放行但工单 |
| P2 | 爆量、文件数异常 | 成本与性能值班 |
告警必须带:表、分区、ratio、链接查 SQL、上次成功基线。
8. 周报与治理
- Top 跌破 / 爆量表
- 长期无监控的核心表清单
- 阈值误报回顾(阈值校准)
常见坑(至少牢记这些)
只看调度成功
空分区最经典。绝对值:每天必须 > 1000 万
周末/大促必炸;用相对基线。ANALYZE 过期当真理
统计未刷新会误判;关键表以 COUNT/可靠元数据为准。爆量不告警
倾斜与账单问题同样是事故。告警无认领人
夜间刷屏被忽略;要挂值班与抑制策略。所有表同一阈值
核心 ADS 与调试表必须分开策略。
如何验收(可量化)
- [ ] 核心表 100% 有 volume 采集
- [ ] 空分区 / 跌破阻断阈能挡住下游
- [ ] 人为注入空分区演练:告警与阻断按预期
- [ ] 误报率可接受并有周校准
- [ ] 与新鲜度、对账指标同屏可看
sql
SELECT table_name, dt, row_cnt, size_bytes, rule_status
FROM dq_volume_daily
WHERE dt = '${biz_date}' AND rule_status <> 'PASS'
ORDER BY table_name;bash
echo "table,dt,row_cnt,median_7d,ratio,action"
# dwd_event_di,2026-09-25,0,8000000,0.0,BLOCK
# dws_user_di,2026-09-25,1200000,1100000,1.09,PASS相关面试题
占位:与题库小程序对齐后补链接(建议关联:空分区、数据量监控、波动基线、质量门禁)。
改写说明:结构与判断标准参考 Wood 原创数仓/面试文,已改写成可执行清单;未包含未公开公司数据与内部表名。