Flink作业上线后指标不对——怎么做实时数据质量监控?
先说结论
实时数据质量监控的核心是:在Flink作业内部或下游做检查,发现异常立即告警。检查四个维度:完整性、准确性、一致性、及时性。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
实时数据质量监控是实时数仓的“最后一公里”。作业跑起来了,但数据对不对?很多团队只关注“作业能不能跑”,不关注“数据对不对”。我做了9年数据开发,最痛苦的教训就是:数据质量问题往往在上线几天后才被发现,此时已经影响了业务决策。
四个监控维度
| 维度 | 检查内容 | 检查方法 | 告警阈值 |
|---|---|---|---|
| 完整性 | 数据量是否正常 | 分钟级输入输出比对 | 波动超过30% |
| 准确性 | NULL率、异常值比例 | 每批数据统计NULL比例 | NULL率超过5% |
| 一致性 | 实时指标和离线的偏差 | 定时对账作业 | 偏差超过1% |
| 及时性 | 数据延迟 | Watermark延迟监控 | 延迟超过5分钟 |
实现方案:在Flink作业内部做监控
// 在Flink作业里加一个监控算子
stream
.process(new ProcessFunction<Event, Event>() {
private transient Counter totalCount;
private transient Counter nullCount;
@Override
public void open(Configuration params) {
// 注册Flink Metrics,可以被Prometheus采集
totalCount = getRuntimeContext().getMetricGroup()
.counter("total_events");
nullCount = getRuntimeContext().getMetricGroup()
.counter("null_user_id_events");
}
@Override
public void processElement(Event e, Context ctx, Collector<Event> out) {
totalCount.inc();
if (e.getUserId() == null) {
nullCount.inc(); // 统计NULL率
}
out.collect(e);
}
})
通过Flink Metrics + Prometheus + Grafana的组合,可以实时监控NULL率、输入输出比、延迟等指标,异常时自动告警。
实战经验:上游偷偷加了字段导致数据丢失
我在元宇宙社交App遇到过一次事故:上游客户端更新了埋点格式,加了一个新字段,导致JSON反序列化失败,整个流的数据都丢了。但我们没有监控输入量的变化,过3天后业务方发现报表数据异常才告警。
从那以后我的规矩:
- 每个Flink作业必须有输入输出量的分钟级监控
- JSON解析必须加json.ignore-parse-errors=true容错,解析失败的数据输出到侧输出而不是直接丢弃
- 解析失败率超过1%立即告警
总结
实时数据质量监控4个维度:完整性、准确性、一致性、及时性。通过Flink Metrics + Prometheus + Grafana实现自动监控和告警。面试时能说清楚4个监控维度和具体实现方案,再加一个“上游改格式导致数据丢失3天才发现”的踩坑,就很有深度。
下一篇聊Flink SQL的新语法——窗口TVF比旧语法好在哪里?为什么新项目应该用TVF?
你们生产环境有实时数据质量监控吗?评论区聊聊~
关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长