使用Prometheus JMX Exporter获取Spark2集群指标失败求助
问题分析与修正方案
首先看你cluster模式的提交命令,存在几个关键问题,导致Prometheus无法采集到指标:
1. 配置项格式错误
你把多个Spark配置项塞到了同一个--conf参数里,而且没有正确分隔,Spark无法正确解析这些配置。每个spark.*配置应该单独使用--conf参数,或者在同一个--conf里用**分号(Linux/macOS环境)**分隔不同的配置项。
2. 文件路径与分发问题
- 在cluster模式下,Driver会在集群的某个节点上启动,你指定的绝对路径
/jars/、/conf/在集群节点上不一定存在,路径解析会出错。 --files参数应该用来分发你的spark.yml配置文件,而不是jmx agent的jar包——spark.jars已经会自动把指定的jar包分发到所有Driver和Executor节点的classpath中。- 当用
--files上传文件后,在Driver和Executor的运行目录中,这些文件是直接放在当前工作目录下的,所以路径应该用相对路径./spark.yml,而不是绝对路径。
3. Executor端口冲突风险
你给所有Executor指定了固定的8061端口,如果同一个节点上启动多个Executor,会出现端口占用冲突的问题,建议使用动态端口(比如=0:./spark.yml,让系统自动分配可用端口),或者指定一个端口范围。
修正后的提交命令
./spark-submit --supervise \ --deploy-mode cluster \ --conf "spark.driver.extraJavaOptions=-javaagent:./jmx_prometheus_javaagent-0.12.0.jar=8060:./spark.yml" \ --conf "spark.executor.extraJavaOptions=-javaagent:./jmx_prometheus_javaagent-0.12.0.jar=0:./spark.yml" \ --conf "spark.jars=./jars/jmx_prometheus_javaagent-0.12.0.jar" \ --files ./conf/spark.yml \ --class org.apache.spark.examples.SparkTC \ --master spark://host1:7077,host2:7077 \ --executor-memory 1G \ --total-executor-cores 1 \ ./spark/spark-2.4.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.0.jar 1
额外注意事项
- 端口可达性:确保Prometheus所在的机器能访问到集群中Driver节点的8060端口,以及所有Executor节点的动态分配端口(如果需要采集Executor指标的话)。
- 日志排查:如果还是不行,可以查看Driver和Executor的日志(通过Spark UI或者集群节点的日志目录),看是否有jmx agent加载失败的报错,比如找不到jar包或者配置文件的错误信息。
- 版本兼容性:确认
jmx_prometheus_javaagent-0.12.0.jar和Spark 2.4.0的Java版本兼容(Spark 2.4.x一般适配Java 8,agent也需对应版本编译)。
内容的提问来源于stack exchange,提问作者PPB




