3. Spark监控工具介绍:Spark Web UI、Spark History Server、Ganglia、Prometheus + Grafana
在模型风险管理场景中,Spark作业的稳定性与性能直接关系到模型训练与推理的时效性。当出现OOM、数据倾斜、任务长尾等异常时,快速定位根因依赖一套完善的监控工具链。本章系统介绍四种主流Spark监控工具:Spark Web UI(实时诊断)、Spark History Server(历史回溯)、Ganglia(集群级指标)、Prometheus + Grafana(自定义告警与可视化)。
选型建议: 生产环境推荐“Spark Web UI(实时)+ History Server(历史)+ Prometheus + Grafana(告警)”组合;Ganglia适用于已有Hadoop生态的遗留集群。
3.1 Spark Web UI:实时作业诊断的第一站
每个Spark应用在运行期间都会在Driver端启动一个Web UI,默认端口4040。它提供作业、Stage、Task级别的实时指标,是排查“当前作业为什么慢”的首选工具。
核心页面与用途
| 页面Tab | 关键指标 | 异常排查场景 |
|---|---|---|
| Jobs | 作业状态、运行时间、进度条 | 判断作业是否卡在某个Action |
| Stages | Shuffle读写量、Task数量、失败Task数 | 定位数据倾斜(少数Task数据量远大于均值) |
| Storage | RDD缓存大小、缓存级别、丢失分区 | 检查缓存是否被驱逐导致重复计算 |
| Executors | 每个Executor的GC时间、Shuffle内存、已用内存 | 发现OOM前兆(GC时间占比 > 20%) |
| SQL | 物理计划、扫描行数、Join方式 | 确认是否触发了BroadcastJoin或SortMergeJoin |
实战技巧: 当模型训练作业变慢时,优先查看Stages页面的“Shuffle Read Size/Records”列。如果某个Stage中少数Task的Shuffle Read量是其他Task的10倍以上,基本可以判定存在数据倾斜。
3.2 Spark History Server:离线回溯与对比分析
Spark Web UI仅在作业运行期间可用。作业结束后,若需复盘历史作业的异常,必须依赖Spark History Server(SHS)。它读取Spark事件日志(默认存储在HDFS或本地路径),提供与Web UI几乎一致的界面。
配置要点
# spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenode:8020/spark-history
spark.history.fs.logDirectory hdfs://namenode:8020/spark-history
spark.history.ui.port 18080
典型应用场景
- 异常复盘: 凌晨作业失败,次日通过SHS查看失败Stage的异常栈与Task重试次数。
- 性能对比: 对比模型v1与v2版本的Stage耗时,定位哪个算子退化。
- 资源审计: 查看历史作业的Executor峰值内存、Shuffle spill量,为资源申请提供依据。
注意: SHS不会自动清理历史日志。建议配置
spark.history.retainedApplications(默认50)或设置外部定时任务删除过期日志,避免HDFS小文件过多。
3.3 Ganglia:集群级资源监控
Ganglia是Hadoop生态中经典的分布式监控系统,通过gmond(采集节点)和gmetad(聚合元数据)收集CPU、内存、网络、磁盘等指标。在Spark场景中,它帮助回答“集群资源是否够用”的问题。
与Spark的关联指标
| 指标类别 | 具体指标 | Spark异常关联 |
|---|---|---|
| CPU | load_one, cpu_user, cpu_wio | CPU高但Spark作业慢 → 检查是否有其他YARN应用抢占 |
| 内存 | mem_free, swap_used | 内存剩余接近0 → 可能触发OOM Killer |
| 网络 | bytes_in, bytes_out, pkts_drop | 网络丢包率突增 → Shuffle传输异常 |
| 磁盘 | disk_free, disk_io | 磁盘IO饱和 → Shuffle spill写入缓慢 |
局限性: Ganglia无法感知Spark内部算子级别的指标(如Stage耗时、Task数据分布),必须与Spark Web UI配合使用。
3.4 Prometheus + Grafana:自定义告警与可视化
这是当前最流行的开源监控组合。Spark 3.x 原生支持通过SparkMetric或PushGateway将指标暴露给Prometheus,再由Grafana绘制仪表盘并配置告警规则。
架构流程
关键配置示例
1. Spark开启Prometheus指标暴露
# spark-defaults.conf
spark.ui.prometheus.enabled true
spark.executor.processTreeMetrics.enabled true
spark.metrics.conf.*.sink.prometheus.class org.apache.spark.metrics.sink.PrometheusServlet
2. Prometheus抓取配置(prometheus.yml)
scrape_configs:
- job_name: 'spark_driver'
metrics_path: '/metrics/prometheus'
static_configs:
- targets: ['driver-host:4040']
- job_name: 'spark_executor'
metrics_path: '/metrics/executor'
static_configs:
- targets: ['executor1:4040', 'executor2:4040']
3. Grafana告警规则示例(针对模型训练作业)
# 当Executor GC时间占比超过25%时触发告警
- alert: ExecutorGCHigh
expr: rate(spark_executor_jvm_gc_time_seconds_total[5m]) / rate(spark_executor_jvm_cpu_time_seconds_total[5m]) > 0.25
for: 2m
labels:
severity: warning
annotations:
summary: "Executor GC时间占比超过25%,可能存在内存压力"
3.5 工具对比与选型矩阵
| 工具 | 数据粒度 | 实时性 | 历史回溯 | 告警能力 | 部署复杂度 | 模型风险场景推荐度 |
|---|---|---|---|---|---|---|
| Spark Web UI | Task级 | 实时 | 仅运行期 | 无 | 低(内置) | ★★★★★ |
| Spark History Server | Task级 | 离线 | 完整 | 无 | 低 | ★★★★★ |
| Ganglia | 节点级 | 准实时 | 有限 | 基础 | 中 | ★★★☆☆ |
| Prometheus + Grafana | 自定义(可到算子级) | 实时 | 完整(配合Thanos) | 强大 | 高 | ★★★★★ |
模型风险监控最佳实践:
- 日常开发调试:使用Spark Web UI实时观察Stage与Task分布。
- 异常复盘与模型版本对比:使用Spark History Server加载历史事件日志。
- 集群资源水位与长期趋势:使用Prometheus + Grafana配置仪表盘,对GC时间、Shuffle spill量、作业失败率设置告警。
- 遗留Hadoop集群:保留Ganglia作为节点级资源兜底监控。