Spark 3.1是否支持向Prometheus推送指标?是否有对应handler?
Spark 3.1 对接 Prometheus 的指标推送能力说明
核心结论
Spark 3.1 没有内置主动向 Prometheus 推送指标的官方handler,原生提供的Prometheus指标对接能力仅支持pull拉取模式。
原生能力边界说明
Spark 3.1 的指标体系(Metrics System)基于Dropwizard Metrics实现,官方自带的Prometheus相关实现只有PrometheusServlet:该组件会在Driver、Executor的HTTP服务上暴露/metrics/prometheus接口,等待Prometheus Server定时拉取指标,全程没有主动向外发起指标上报的逻辑。
额外说明:Prometheus Server本身就没有设计面向业务端的直接指标推送接收接口,其提供的Remote Write接口是用于存储联邦、远端存储同步的,并非为业务指标上报场景设计,所有主动推送指标的场景,Prometheus官方标准方案是通过Pushgateway做中转,再由Prometheus从Pushgateway拉取指标。
主动推送的落地实现方案
如果需要实现Spark侧主动上报指标的效果,不需要魔改Spark内核,有三种成熟路径可选:
- 基于原生GraphiteSink + Graphite Exporter中转:不需要额外开发,仅修改Spark的metrics配置即可。Spark原生自带Graphite协议的推送sink,主动将指标推送到部署好的Graphite Exporter端口,再由Prometheus拉取Exporter暴露的指标,全版本兼容Spark 3.1。
- 自定义MetricSink实现Pushgateway推送:自行实现
org.apache.spark.metrics.sink.Sink接口,重写start、stop、report方法,在report逻辑里实现指标格式化、推送到Pushgateway的逻辑即可。编译打包后将jar放入Spark的jars目录,在metrics配置中启用该自定义sink就能生效,开发量很小。 - 引入第三方Remote Write Sink:如果你的后端是兼容Prometheus Remote Write协议的时序存储(比如VictoriaMetrics、M3DB等),可以直接使用开源的Spark Remote Write指标sink依赖,不需要自行开发推送逻辑,配置后即可直接向存储端推送指标。
配置示例(GraphiteSink中转模式)
在Spark的metrics.properties文件中添加如下配置即可实现Driver/Executor每10秒主动上报一次指标:
*.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink *.sink.graphite.host=graphite-exporter部署地址 *.sink.graphite.port=9109 *.sink.graphite.period=10 *.sink.graphite.unit=seconds *.sink.graphite.prefix=spark_business_metrics
- 注意:不要尝试跳过中转组件直接向Prometheus Server推送指标,会直接导致Prometheus出现时序标签冲突、存储负载异常、指标乱序等问题,不符合Prometheus的设计逻辑。
- 补充:Spark 3.2及后续更高版本,官方也没有新增内置的Prometheus推送类sink,所有推送场景都需要走上述方案实现,不存在版本升级后原生支持的情况。
内容的提问来源于stack exchange,提问作者Esther Rodriguez
相关产品推荐
相关产品推荐

