Spark 3.5 与 Prometheus 集成:5 步配置实现 50+ 指标可视化
在当今数据驱动的业务环境中,实时监控 Spark 应用的运行状态已成为保障数据处理流水线稳定性的关键环节。本文将手把手带您完成从零搭建 Spark 3.5 指标监控体系的完整流程,涵盖配置调优、指标采集、可视化展示等核心环节,最终实现包含 200+ 核心指标的自动化监控看板。
1. 环境准备与基础配置
1.1 修改 metrics.properties 文件
Spark 的指标系统默认采用 Dropwizard Metrics 库,我们需要首先启用 Prometheus 支持的 Sink 类型。在$SPARK_HOME/conf/metrics.properties中添加以下配置:
*.sink.prometheusServlet.class=org.apache.spark.metrics.sink.PrometheusServlet *.sink.prometheusServlet.path=/metrics/prometheus master.source.jvm.class=org.apache.spark.metrics.source.JvmSource worker.source.jvm.class=org.apache.spark.metrics.source.JvmSource driver.source.jvm.class=org.apache.spark.metrics.source.JvmSource executor.source.jvm.class=org.apache.spark.metrics.source.JvmSource关键参数说明:
path指定 Prometheus 拉取指标的 HTTP 端点- 每个组件(master/worker/driver/executor)都需要单独配置 JVM 指标源
1.2 启用 Prometheus Servlet
在spark-defaults.conf中追加配置,确保 Driver 和 Executor 都暴露指标接口:
spark.metrics.conf=/path/to/metrics.properties spark.ui.prometheus.enabled=true spark.executor.processTreeMetrics.enabled=true2. 指标暴露与采集方案
2.1 组件级指标分类
Spark 的监控指标可分为三大类,每类包含不同维度的数据:
| 指标类型 | 采集对象 | 典型指标示例 |
|---|---|---|
| JVM 指标 | 所有组件 | heap_used, gc_time |
| Spark 内部指标 | Driver/Executor | rdd_blocks, thread_count |
| 系统资源指标 | 物理节点 | cpu_load, disk_io |
2.2 Prometheus 服务发现配置
创建prometheus.yml的 scrape_configs 部分,动态发现 Spark 组件:
scrape_configs: - job_name: 'spark-drivers' metrics_path: '/metrics/prometheus' file_sd_configs: - files: ['/etc/prometheus/targets/spark-drivers.json'] - job_name: 'spark-executors' metrics_path: '/metrics/prometheus' kubernetes_sd_configs: - role: pod namespaces: names: ['spark-namespace']3. 生产级部署方案
3.1 Docker Compose 完整示例
以下 docker-compose.yml 包含全套监控组件:
version: '3' services: prometheus: image: prom/prometheus ports: ["9090:9090"] volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml grafana: image: grafana/grafana ports: ["3000:3000"] spark-master: image: spark:3.5.0 environment: - SPARK_MASTER_WEBUI_PORT=8080 - SPARK_MASTER_OPTS=-Dspark.metrics.conf=/opt/spark/conf/metrics.properties3.2 关键调优参数
在资源受限环境中需要特别关注这些参数:
spark.metrics.executorMetricsSource.enabled=true spark.executor.metrics.pollingInterval=5s spark.sql.streaming.metricsEnabled=true4. Grafana 看板开发
4.1 核心监控面板设计
推荐按功能划分的看板结构:
资源视角
- JVM 内存趋势图
- CPU 利用率热力图
- 网络 IO 流量图
作业视角
- Stage 执行时间矩阵
- Task 失败率仪表盘
- 数据倾斜检测图
流处理视角
- 批次延迟监控
- 积压批次告警
- 处理速率波动图
4.2 告警规则示例
在 Prometheus 中配置关键告警:
alert: SparkExecutorOOM expr: avg_over_time(spark_executor_jvm_memory_used{area="heap"}[5m]) / spark_executor_jvm_memory_max{area="heap"} > 0.9 for: 10m labels: severity: critical annotations: summary: "Executor {{ $labels.instance }} memory usage over 90%"5. 高级监控技巧
5.1 自定义指标采集
通过 SparkListener 接口扩展业务指标:
class CustomSparkListener extends SparkListener { override def onTaskEnd(taskEnd: SparkListenerTaskEnd): Unit = { val metrics = taskEnd.taskMetrics val recordsRead = metrics.inputMetrics.recordsRead // 将指标推送到Prometheus PushGateway } }5.2 性能优化建议
根据监控数据常见的调优方向:
内存优化
当发现频繁 GC 时,调整:spark.executor.memoryOverhead=2G spark.memory.fraction=0.6并行度优化
针对数据倾斜场景:-- 在Spark SQL中启用自适应查询执行 SET spark.sql.adaptive.enabled=true; SET spark.sql.adaptive.coalescePartitions.enabled=true;
实际部署中,某电商平台通过此方案将异常发现时间从小时级缩短到秒级,关键作业的 SLA 达标率提升至 99.99%。特别是在大促期间,通过实时监控数据动态调整资源分配,节省了 40% 的计算资源成本。