订阅更新

数据湖怎么监控?——关键指标和告警

数据湖手册 第 19 题 约 9 分钟读完

本文目录
  1. 先说结论
  2. 真实案例:监控提前发现数据异常
  3. 表级监控指标
  4. 查询级监控指标
  5. 监控指标汇总表
  6. 告警策略设计
  7. 监控工具选型
  8. 面试高频追问
  9. 实战踩坑:告警漏配导致故障
  10. 总结

先说结论

核心监控指标:表级指标文件数量、文件大小、数据跳过率;查询级指标查询耗时、Shuffle数据量、Task时间分布;系统级指标NameNode内存、Driver内存、Executor GC。

告警策略:小文件告警文件平均大小小于64MB、查询慢告警查询时间超过阈值、数据质量告警行数异常、存储告警增长过快。

监控工具:Spark UI、Prometheus+Grafana、Delta Lake's Table History、自定义指标采集。

最佳实践:设置分级告警Warning Critical、定期回顾告警有效性、监控指标可视化、建立告警响应流程.

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

详细讲解

这道题面试官问得很多,因为数据湖监控是生产环境稳定运行的保障。我在某出海硬件品牌搭建过完整的监控体系,成功提前发现多个潜在问题。很多人只知道查询慢了才处理,但说不清楚怎么提前预警。面试官想听的是你能说清楚监控指标、告警策略和实战经验。

真实案例:监控提前发现数据异常

2023年在某知名出海硬件品牌,我们通过监控发现用户行为表的数据量异常。

监控指标:我们每天检查表的行数,正常情况下每天约1亿行。

# 每日数据量检查脚本
#!/bin/bash
COUNT=$(spark-sql -e "SELECT COUNT(*) FROM user_behavior WHERE dt='$(date +%Y-%m-%d)'" | tail -1)
if [ $COUNT -lt 50000000 ]; then
  echo "WARNING: Low row count: $COUNT"
  # 发送告警
fi

发现异常:某天监控报警,行数只有1000万,远低于正常值1亿。

排查原因:上游任务失败了,数据没有写入。因为监控及时,我们在业务发现前就修复了问题。

改进效果:如果没有监控,业务部门第二天发现报表数据不对才会排查,影响更大。

表级监控指标

文件统计:文件数量、文件大小分布、小文件比例。DESCRIBE TABLE EXTENDED可以查看。

-- 查看表统计
DESCRIBE EXTENDED user_behavior;
-- 关键指标:
-- numFiles: 文件数量
-- sizeInBytes: 总大小
-- lastModified: 最后修改时间

分区统计:分区数量、分区大小分布。分区数量过多需要合并,分区大小不均需要重新均衡。

数据跳过率:Z-Ordering表的跳过率。低于80%需要重新OPTIMIZE。

事务日志:事务日志大小、增长速度。日志过大需要VACUUM清理。

# 事务日志监控
LOG_SIZE=$(du -sh /data/user_behavior/_delta_log | awk '{print $1}')
if [ ${LOG_SIZE%G} -gt 10 ]; then
  echo "WARNING: Transaction log too large: $LOG_SIZE"
fi

查询级监控指标

查询耗时:总体耗时、各阶段耗时。duration超过阈值需要告警。

Stage耗时:找出慢Stage,定位瓶颈。某Stage占比超过50%需要优化。

Task耗时分布:数据倾斜检查。某Task耗时是平均值的10倍以上说明有倾斜。

Shuffle数据量:Shuffle Read/Write数据量。超过表大小50%说明Shuffle过多。

Spark SQL指标:通过Spark UI查看。dataSkewed、numRows、sizeInBytes等。

-- 查询监控
val df = spark.sql("SELECT * FROM user_behavior WHERE dt='2024-03-20'")
df.queryExecution.executedPlan.foreach { p =>
  println(s"${p.nodeName}: ${p.metrics}")
}

监控指标汇总表

类别指标阈值告警
表级文件平均大小< 64MB需要OPTIMIZE
表级文件数量> 10万需要合并小文件
表级分区数量> 10万需要重新设计分区
表级事务日志大小> 10GB需要VACUUM
查询级查询耗时> 正常值2倍需要优化
查询级数据跳过率< 80%需要重新Z-Ordering
查询级Task最大耗时> 平均值10倍数据倾斜
系统级NameNode内存使用> 80%需要扩容

告警策略设计

分级告警:Warning告警提示注意、Critical告警需要立即处理、Emergency告警需要电话通知。

告警抑制:相同告警5分钟内只发一次、告警确认后暂时抑制、维护窗口暂停告警。

告警路由:表级告警发送给数据owner、查询级告警发送给开发团队、系统级告警发送给运维团队。

告警响应:建立告警响应SLA、Critical告警15分钟内响应、Emergency告警立即响应。

# 告警脚本示例
#!/bin/bash
METRIC_VALUE=$(get_metric_value)
THRESHOLD_WARNING=100
THRESHOLD_CRITICAL=200
 
if [ $METRIC_VALUE -gt $THRESHOLD_CRITICAL ]; then
  send_alert "CRITICAL: Value is $METRIC_VALUE"
elif [ $METRIC_VALUE -gt $THRESHOLD_WARNING ]; then
  send_alert "WARNING: Value is $METRIC_VALUE"
fi

监控工具选型

工具用途优点缺点
Spark UI查询监控实时、详细信息需要手动查看、无历史
Delta History表变更监控内置、易用仅Delta Lake
Prometheus+Grafana综合监控可视化、告警需要配置metrics
自定义脚本灵活监控完全自定义需要维护

面试高频追问

追问一:监控指标太多,哪些是最重要的?

三个核心指标:1)文件平均大小,判断是否需要OPTIMIZE;2)查询耗时,判断性能是否正常;3)数据跳过率,判断Z-Ordering是否有效。其他指标是这三个的补充。

追问二:告警太多会产生告警疲劳,怎么解决?

三种方法:1)优化告警阈值,只告真正重要的问题;2)告警聚合,同类告警合并发送;3)告警抑制,相同告警短时间内只发一次。我们遇到过告警疲劳,通过优化阈值减少了80%的告警。

追问三:数据质量怎么监控?

四个维度:完整性行数检查、唯一性主键检查、准确性范围检查、及时性延时检查。例如user_id必须唯一、amount必须大于0、数据必须在每天8点前到达。这些都是数据质量监控的关键指标。

实战踩坑:告警漏配导致故障

2023年在某出海硬件品牌,我们因为缺少监控导致一次生产故障。

背景:我们监控了查询耗时,但没有监控文件数量。

问题:某张表的文件数量逐渐增加到100万个,单个查询打开了太多文件,Driver OOM失败。

原因:高频写入导致小文件越来越多,但我们没有监控文件数量指标。

解决方案:我们增加了文件数量和平均文件大小的监控告警。

# 新增监控:文件数量
#!/bin/bash
TABLE_PATH=/data/user_behavior
FILE_COUNT=$(hdfs dfs -count $TABLE_PATH/* | awk '{sum+=$1} END {print sum}')
AVG_SIZE=$(hdfs dfs -du -s $TABLE_PATH/* | awk '{sum+=$1; count++} END {print sum/count}')
 
if [ $FILE_COUNT -gt 100000 ]; then
  send_alert "CRITICAL: Too many files: $FILE_COUNT"
fi
 
if [ $AVG_SIZE -lt 67108864 ]; then  # 64MB
  send_alert "WARNING: Average file size too small: $(($AVG_SIZE/1024/1024))MB"
fi

改进效果:增加监控后,我们提前发现并处理了3次小文件问题,避免了生产故障。

总结

数据湖监控是生产环境稳定运行的保障。核心监控指标包括:表级文件数量和大小、查询级耗时和数据跳过率、系统级内存和GC。告警策略要分级、设置合理的阈值、避免告警疲劳。监控工具选择Spark UI、Prometheus、自定义脚本组合。最佳实践是:建立完整的监控体系、定期回顾告警有效性、建立告警响应流程。面试时能说清楚监控指标、告警策略、实战经验,就很稳.

下一篇聊一个综合案例:从Hive迁移到数据湖实战——完整迁移方案和踩坑经验

你们生产环境有哪些监控?评论区聊聊~

关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长

刷题进度保存在当前浏览器