Spark on YARN环境下Prometheus动态抓取目标的优雅实现方案咨询
Spark on YARN 环境 Prometheus 指标自动发现方案
方案1:YARN API + Prometheus HTTP SD(生产级首选)
Prometheus 2.28及以上版本原生支持http_sd_config能力,可定期从指定HTTP接口拉取抓取目标列表,无需修改本地配置文件。你可以自行开发一个轻量的HTTP服务,实现逻辑如下:
- 定期调用YARN ResourceManager的REST API
/ws/v1/cluster/apps,拉取所有状态为RUNNING的应用 - 过滤出Spark类型应用后,分别拼接对应版本的指标端点:
- Spark2:提前在集群的
spark-defaults.conf中统一配置jmx_exporter端口,比如统一使用12345作为指标端口,从YARN API拿到Driver/Executor所在主机IP后,拼接http://{主机IP}:12345/metrics作为抓取端点 - Spark3:提前开启配置
spark.ui.prometheus.enabled=true,YARN API会返回Spark UI的访问地址,直接在地址后拼接/metrics/prometheus/即可作为抓取端点
- Spark2:提前在集群的
- 将整理好的目标列表按照Prometheus HTTP SD要求的JSON格式返回,可同时附加
application_id、app_name、queue等标签,方便后续指标筛选查询
该方案无需修改作业提交逻辑,无额外中间件依赖,YARN API本身稳定性极高,适合绝大多数生产场景。
方案2:Spark监听钩子 + 注册中心SD
如果你的生产环境已经部署了Consul等注册中心,可以采用该方案实现更低延迟的发现:
- 开发自定义的Spark
ApplicationListener,在Driver启动完成后,将当前作业的指标端点信息主动注册到注册中心,作业结束时自动触发注销逻辑 - Prometheus配置对应注册中心的服务发现规则,直接拉取已注册的Spark指标端点即可
该方案无需轮询YARN API,实时性更高,适合作业量极大的大规模YARN集群场景。
生产注意事项
- 集群层面统一配置Spark指标暴露规则,所有作业使用相同的指标端口、路径,降低服务发现逻辑的适配复杂度
- 给服务发现服务增加缓存机制,轮询YARN API的间隔可设置为30s~1min,避免给ResourceManager造成额外压力
- 增加端点健康检查逻辑,自动剔除已结束作业的端点,避免Prometheus产生无效抓取请求
内容的提问来源于stack exchange,提问作者Jarek Cellary
相关产品推荐
相关产品推荐

