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绘制仪表盘并配置告警规则。

架构流程

Prometheus + Grafana 监控Spark架构 Spark Driver /metrics/prometheus Spark Executor /metrics/executor PushGateway (可选,批处理场景) Prometheus 拉取/推送指标 Grafana 仪表盘 + 告警 AlertManager 说明: Streaming场景:Driver/Executor 直接暴露 /metrics 端点 Batch场景:通过PushGateway推送

关键配置示例

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) 强大 高 ★★★★★
模型风险监控最佳实践:
  1. 日常开发调试:使用Spark Web UI实时观察Stage与Task分布。
  2. 异常复盘与模型版本对比:使用Spark History Server加载历史事件日志。
  3. 集群资源水位与长期趋势:使用Prometheus + Grafana配置仪表盘,对GC时间、Shuffle spill量、作业失败率设置告警。
  4. 遗留Hadoop集群:保留Ganglia作为节点级资源兜底监控。