Spark UI打不开或指标为空,主因是监控未启用、端口冲突或配置错误;metrics.properties需严格路径/格式;Executor shuffle明细需手动开启显示;Prometheus上报须配sink类、端口及namespace。

Spark UI 端口打不开或指标为空
本地开发或 YARN 集群上跑 spark-submit 后,http://localhost:4040(或对应 driver 端口)打不开,或者打开后 Jobs/Stages/Storage 页面全是空的——大概率是 Spark 没启用监控模块,或端口被占、网络隔离。
- 确认启动时没加
--conf spark.ui.enabled=false;默认是true,但有些打包脚本会误关 - Driver 进程必须存活,且未设置
spark.ui.port为 0(这会让 Spark 随机选端口,得看日志找实际值) - YARN 模式下,
spark.ui.port无效,要用spark.yarn.appMasterEnv.SPARK_UI_PORT或直接查 YARN Web UI 里的 ApplicationMaster 链接 - 本地调试时如果用
spark.master=local[*]却看不到 UI,检查是否在SparkContext构建前就调用了sc.stop()或异常退出
metrics.properties 配置不生效
想把 JVM GC、executor 内存、shuffle 指标推到 Graphite 或 Prometheus,改了 $SPARK_HOME/conf/metrics.properties 却没数据——配置文件路径、格式、sink 类名三者错一个就静默失败。
- 配置文件必须叫
metrics.properties,且放在SPARK_HOME/conf/下;若用--files提交,需额外通过--conf spark.metrics.conf=metrics.properties指定路径 - 每行只能有一个 key-value,不能有空格或注释符号
#在中间;比如sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink少个点就加载失败 - Graphite sink 需要
graphite.host和graphite.port,但默认不带spark-metrics_2.12依赖,YARN 模式下得用--jars补上 - 开启
source.jvm才能看到 GC/Heap,否则只有 Spark 自身的 executor/shuffle 指标
如何获取 executor 级别的 shuffle write/read 量
业务慢了,想确认是不是 shuffle 数据膨胀导致磁盘/网络瓶颈,但 Spark UI 的 Summary 只给总和,看不到每个 executor 的明细。
- UI 的 Executors 标签页里,
Shuffle Read/Write Metrics列默认不显示,要手动勾选右上角的「Show additional metrics」 - 这些字段本质来自
ExecutorMetricsSource,底层对应ShuffleReadMetrics和ShuffleWriteMetrics对象,只在 task 完成后上报,running 中的 task 不可见 - 若用 Structured Streaming,
StreamingQueryListener拿不到 shuffle 细节,得靠StreamingQueryProgress的durationMs和stateOperators间接推测 - 注意单位:UI 显示的是 bytes,不是 records;
Shuffle Write Bytes Written包含压缩前原始大小,和spark.sql.adaptive.enabled开启后的动态调整无关
自定义指标上报到 Prometheus 的最小可行方案
不想搭 Graphite,只想用 Prometheus 抓 Spark 的自定义业务指标(比如某个 UDF 调用耗时),又不想引入 micrometer 全套生态。
立即学习“Python免费学习笔记(深入)”;
- Spark 3.0+ 原生支持 Prometheus sink,配置项是
sink.prometheus.class=org.apache.spark.metrics.sink.PrometheusSink - 必须显式指定
prometheus.port(如9091),且该端口不能被占用;Prometheus 抓取路径固定为/metrics/executors/prometheus - 自定义指标要注册到
MetricRegistry,例如:sc.listenerBus.metricsSystem.registerSource(new MyCustomSource()),其中MyCustomSource实现MetricSource - 别漏掉
spark.metrics.namespace,否则所有指标都带app前缀,和你的 job 名不一致,查起来费劲
真正麻烦的是指标生命周期:driver 重启后 registry 清空,executor 挂掉时上报中断,这些边界情况比配置本身更常出问题。


















