Databricks Spark 3.1.1 下PrometheusServlet无法获取指标求解决方案
问题核心原因
Databricks 托管 Runtime 对原生 Spark UI 做了封装改造,默认走 HTTPS 加密+身份校验链路,没有对外暴露原生裸HTTP的8080端口,你拿到的8080端口返回的是未完成HTTPS握手的错误二进制包,所以会出现P%异常响应、SSL证书报错的问题。
PrometheusServlet 适配方案(可跑通)
你现有的配置本身没有问题,只需要调整访问方式即可:
- 不要直接访问 Worker 节点公网IP的端口,Databricks 所有 Spark UI 相关路径都通过工作区的反向代理对外暴露,统一走工作区443端口
- 访问时需要携带 Databricks 个人访问token做身份校验,同时跳过自签证书校验,测试curl命令如下:
curl -k -H "Authorization: Bearer <你的Databricks个人访问Token>" https://<你的Databricks工作区域名>/driver-proxy-api/o/0/<集群ID>/metrics/prometheus
- Prometheus 采集任务对应配置要加认证头、关闭SSL校验,不需要额外放开Worker节点的公网端口,安全组仅需要允许Prometheus访问Databricks工作区的443端口即可。
更适合Databricks生产环境的替代方案
如果觉得反向代理+认证的采集方式维护成本高,可以选择以下两种更稳定的方案:
方案1:指标推送模式
不用拉取,直接通过初始化脚本配置Graphite Sink,把指标主动推到你部署的Prometheus Pushgateway或者Graphite服务,再对接Grafana,参考metrics.properties配置如下:
*.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink *.sink.graphite.host=<你的Pushgateway/Graphite服务内网地址> *.sink.graphite.port=9109 *.sink.graphite.period=10 *.sink.graphite.unit=seconds *.sink.graphite.prefix=databricks.cluster.<自定义集群标识>
方案2:AWS CloudWatch 原生对接
Databricks on AWS 原生支持集群指标直接推送到CloudWatch,只需要在集群配置中开启对应权限,无需额外修改metrics配置,直接在Grafana中添加CloudWatch数据源即可读取指标,稳定性最高,适合生产环境使用。
内容的提问来源于stack exchange,提问作者zyd
相关产品推荐
相关产品推荐

