K8s 1.22环境升级Spark Operator至1.3.3后jmx_exporter启动失败
问题根因
Spark Operator 1.3.x 版本新增了JMX Prometheus监控自动注入逻辑,默认会给所有提交的Spark应用的Driver、Executor注入jmx_prometheus_javaagent启动参数,参数中硬编码指定配置文件路径为/etc/metrics/conf/prometheus.yaml。
1.2.x版本不存在该自动注入逻辑,因此原有手动指定jmx_exporter_0.15路径的配置可以正常运行。升级到1.3.3后,自动注入的agent参数会优先加载,但未提前将对应prometheus配置文件挂载到Pod的指定路径,直接触发FileNotFoundException导致JVM启动失败。
解决方案
根据是否需要使用Operator自带的JMX监控能力二选一即可:
方案1:关闭自动注入的JMX监控(最快恢复,兼容原有配置)
不需要使用Operator自动配置的监控能力时,直接关闭自动注入开关,原有手动指定jmx_exporter路径的逻辑不受影响:
- 全局关闭(对所有应用生效):如果通过Helm部署Spark Operator,修改values.yaml配置:
metrics: enablePrometheusAgent: false
执行Helm升级后重启Operator,新提交的应用不会再自动注入jmx agent参数。
- 单应用关闭(仅对指定Spark应用生效):在对应SparkApplication CR的
spec.sparkConf字段下添加配置:
sparkConf: spark.jmx.prometheus.enabled: "false"
重新提交应用即可恢复正常启动。
方案2:保留自动JMX监控能力
需要使用Operator自带的监控采集能力时,补全配置文件挂载即可:
- 准备jmx exporter所需的
prometheus.yaml配置文件,最小可用配置示例:
rules: - pattern: ".*"
- 将该配置文件创建为K8s ConfigMap:
kubectl create configmap spark-jmx-exporter-config --from-file=prometheus.yaml=./prometheus.yaml -n <Spark应用所在命名空间>
- 修改SparkApplication CR配置,为Driver和Executor都添加ConfigMap卷挂载,将上述ConfigMap挂载到
/etc/metrics/conf路径下,挂载示例:
spec: volumes: - name: jmx-exporter-config configMap: name: spark-jmx-exporter-config driver: volumeMounts: - name: jmx-exporter-config mountPath: /etc/metrics/conf executor: volumeMounts: - name: jmx-exporter-config mountPath: /etc/metrics/conf
重新提交应用后,自动注入的jmx agent即可正常读取配置文件启动。
注意:选择该方案时建议移除之前手动指定的
jmx_exporter_0.15路径配置,避免出现重复加载javaagent的冲突。
内容的提问来源于stack exchange,提问作者Ivan Melnyk
相关产品推荐
相关产品推荐

