K8s部署Spark3.x时UI无Executor/Storage信息问题咨询
问题现象
- 运行环境:已部署Kubeflow的Kubernetes集群运行Spark 3.x版本,作业采用client模式提交,Driver与Executor分别调度到独立Pod运行,作业本身可正常执行完成无运行时异常
- UI异常表现:Spark UI的Jobs、Stages、Environment、SQL标签页展示完全正常,Executors、Storage标签页空白无任何数据
- 现有作业配置:
spark = SparkSession.builder.appName("my_spark_app") \ .config("spark.eventLog.enabled", "true") \ .config("spark.eventLog.dir", "hdfs:///<hdfs-location") \ .config("spark.ui.prometheus.enabled", "true") \ # other spark config options
- 排查目标:确认是否存在遗漏的Spark配置项,或Kubernetes侧Pod、网络配置问题导致上述两个标签页无数据。
解决方案
Executors、Storage标签页的数据完全依赖Spark Driver实时接收所有Executor的状态上报,和已经配置的事件日志、Prometheus指标开关没有直接关联——前者只作用于作业结束后历史服务器的内容展示,后者只是暴露metrics接口供监控系统采集,都不影响运行中实时UI的这两个页面渲染。问题基本出在Driver-Executor状态通信链路不通,或者相关状态保留配置被误改,按以下顺序排查即可:
1. 补全缺失的Spark核心配置
client模式在K8s上运行最容易漏的就是Driver地址绑定配置,直接补全以下参数:
spark = SparkSession.builder.appName("my_spark_app") \ .config("spark.eventLog.enabled", "true") \ .config("spark.eventLog.dir", "hdfs:///<hdfs-location") \ .config("spark.ui.prometheus.enabled", "true") \ # 新增以下配置 .config("spark.driver.bindAddress", "0.0.0.0") \ # 配置为Driver Pod在集群内的可路由IP/对应Service域名,禁止填127.0.0.1、localhost .config("spark.driver.host", "<driver-pod-cluster-accessible-addr>") \ # 固定Driver通信端口,方便后续配置网络放通规则 .config("spark.driver.port", "7077") \ .config("spark.ui.retainedExecutors", "1000") \ .config("spark.ui.retainedStages", "1000") # 其余原有业务配置
配置校验规则:
spark.driver.bindAddress必须设为0.0.0.0,否则Driver默认可能绑定回环地址,Executor根本无法连上Driver的状态上报接口- 确认
spark.ui.executorLogs.enabled没有被手动设为false,Spark 3.x默认是开启状态,如果自定义Spark镜像里提前写死了关闭配置,会直接阻断Executor状态同步 - 禁止把
spark.ui.retainedExecutors、spark.ui.retainedStages设为0,这两个参数控制UI端保留的执行器、阶段状态数量,设为0会直接清空对应页面的展示数据 - 如果开启了UI认证,确认
spark.ui.view.acls包含作业提交用户,权限不足时这两个标签页的内容会被直接拦截不返回
2. 排查Kubernetes侧的网络/权限拦截
如果补完Spark配置问题依旧,基本是K8s集群的网络策略拦截了Executor到Driver的上报流量,Kubeflow环境尤其要注意以下几点:
- 检查集群NetworkPolicy规则:确保Executor所在命名空间可以访问Driver Pod的7077端口(固定的Driver通信端口)、4040端口(UI端口),很多默认多租户隔离策略会直接拦截未显式放通的Pod间流量
- 检查Istio sidecar影响:Kubeflow默认会给所有Pod注入Istio代理,sidecar的流量拦截规则经常会阻断Spark内部的gRPC状态上报请求,可以先给Driver、Executor Pod加上
sidecar.istio.io/inject: "false"注解测试,如果去掉sidecar后页面恢复正常,再针对性配置Istio的服务豁免规则放通Spark内部端口即可 - 如果是通过Kubeflow Notebook提交client模式作业,确认Notebook对应的Driver Pod没有错误配置
hostNetwork: true导致地址注册异常,也不要用Pod的localhost地址作为spark.driver.host值
3. 验证标准
配置调整后重新提交作业,进入Spark UI先查看Executors页,如果能正常列出所有Active/Dead状态的Executor列表,点击对应Executor的Thread Dump接口能正常返回内容,Storage标签页的RDD缓存、块存储数据就会自动同步展示,不需要额外配置其他参数。
内容的提问来源于stack exchange,提问作者Jim T
相关产品推荐
相关产品推荐

