订阅更新

数据质量监控

数仓建模手册 第 18 题 约 5 分钟读完

本文目录
  1. 总结
  2. 质量四维度
  3. 三层监控体系
  4. 问题溯源四步法

总结

记忆点内容
四维度完整性、准确性、一致性、及时性
ETL卡点主键唯一+行数波动+NULL率,不通过不写入
SLA监控核心报表产出时间,逐级告警,留buffer
指标巡检自动校验核心指标的合理性
溯源四步确认范围→追血缘→比对上下游→修复复盘

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

进阶 | 大数据面试 · 数仓建模系列

面试真题
你们数仓的数据质量是怎么保证的?有什么监控和告警机制?

质量四维度

维度定义监控方式
完整性数据有没有漏行数对比、NULL率检查
准确性数据对不对关键指标波动、逻辑校验
一致性多处数据一不一样跨表/跨层对数
及时性数据准不准时分区产出时间监控
Wood的实战经验
我在短剧出海公司,数据质量最常出的问题是「及时性」。海外数据源有时差+网络延迟,上游数据经常比预期晚1-2小时到达,导致下游报表空白。为了解决这个问题,我们把核心报表的调度依赖从「固定时间触发」改成了「数据就绪触发」——上游分区产出成功后才触发下游任务,而不是固定凌晨3点开跑。

三层监控体系

第一层:ETL卡点(写入前拦截)

不通过就不写入下游,从源头拦截问题。核心检查项包括:

主键唯一性检查——GROUP BY primary_key HAVING COUNT(*) > 1,有结果就阻断写入。

行数波动检查——今天的行数和昨天对比,波动超过20%告警。这个阈值根据业务特点调整,比如电商大促期间可以放宽到50%。

关键字段NULL率检查——核心字段如user_id、amount的NULL率超过阈值就告警。

-- 主键唯一性检查
SELECT user_id, COUNT(*) FROM dwd_user
WHERE is_current = 1
GROUP BY user_id HAVING COUNT(*) > 1;
-- 有结果 -> 阻断写入,告警通知
-- 行数波动检查
WITH today AS (SELECT COUNT(*) AS cnt FROM fact WHERE dt='${today}'),
yest AS (SELECT COUNT(*) AS cnt FROM fact WHERE dt='${yesterday}')
SELECT ABS(today.cnt - yest.cnt) * 1.0 / yest.cnt AS change_rate
FROM today, yest;
-- change_rate > 0.2 -> 告警

第二层:产出SLA监控

核心报表的数据必须在每天8:00 AM前产出。7:30未完成→黄色预警(通知数据开发);8:00未完成→红色告警(通知数据开发+业务方);8:30未完成→升级告警(通知Leader)。

经验:SLA要留buffer。如果业务方8点看报表,你的SLA设7:30,留30分钟处理突发情况。不要把SLA设成8:00——那意味着一旦出问题就没有任何缓冲时间。

第三层:指标巡检(准确性兜底)

每天自动跑一遍核心指标的合理性检查。比如DAU不可能为负数,GMV不可能比昨天翻10倍,支付率不可能超过100%。这些规则看似简单,但能兜住很多意想不到的问题。

问题溯源四步法

数据质量告警了,怎么快速定位问题?

第一步:确认影响范围——哪些表/报表受影响?核心还是非核心?

第二步:追数据血缘——从告警表往上游追,找到第一个出问题的节点。

第三步:比对上下游——上游行数正常→问题在当前层ETL逻辑;上游就不正常→继续往上追。

第四步:修复+复盘——修数据→通知业务方→写复盘文档→补监控规则。

Wood的实战经验
我经历过一次严重的质量事故:广告ROI报表数据突然翻了3倍。按血缘往上追,发现是ODS层接入的广告平台API改了字段名,我们的解析逻辑没更新,金额字段解析到了展示次数字段上。一个字段名的变化导致整条链路数据全错。
从那以后ODS层加了字段Schema校验——每次接入数据先检查字段名和类型是否和预期一致,不一致就告警阻断,不让脏数据流入下游。这一个小改动避免了后续好几次类似的问题。
面试加分提示
这题分三个层次回答:
「我们建了三层质量监控体系。第一层是ETL卡点,每个任务写入前校验主键唯一性和行数波动,不通过不写入下游。第二层是产出SLA监控,核心报表必须在8:00前产出,7:30未完成开始逐级告警。第三层是指标巡检,每天自动校验核心指标的合理性——比如DAU不能为负,GMV波动不能超过阈值。」
「出过一次事故:广告平台API改了字段名,ROI翻了3倍。从那以后ODS层加了Schema校验,上游字段变化第一时间告警。」
刷题进度保存在当前浏览器