Spark on Kubernetes创建SparkContext时Executor Pod无法启动无限重启
问题常见原因如下
- Executor与Driver网络连通失败
你配置的spark.driver.host为spark-test-jupyter,需先确认该域名对应的K8s服务已正确创建,且开放了29416(Driver端口)、7777(BlockManager端口)的入口规则。如果服务不存在、端口未暴露,或命名空间下的网络策略禁止了Executor到Driver的端口访问,Executor启动后无法和Driver建立通信,会直接报错退出,Driver感知到Executor失联后会不断创建新的Executor,形成循环。 - RBAC权限不足
你使用的spark-master服务账号需在default命名空间下配置足够的权限,包括Pod的创建、删除、查看权限。如果权限配置缺失,Executor启动后无法和K8s APIServer交互,或Driver无法正常同步Executor状态,都会触发Executor异常退出。 - 自定义镜像不兼容
你为Driver和Executor分别构建了自定义镜像,需确认两个镜像的Spark大版本、Python版本完全一致,否则会出现通信协议不兼容、序列化失败等问题,导致Executor启动后快速退出。另外你当前仅配置了通用的spark.kubernetes.container.image参数,如果Executor镜像和Driver镜像不同,需额外添加配置指定Executor镜像:conf.set("spark.kubernetes.executor.container.image", "<Executor镜像地址>:<标签>") - 配置语法错误
你提供的代码中Namespace配置行存在语法问题,pyspark.SparkConf.set()方法需接收两个逗号分隔的参数,你写的conf.set("spark.kubernetes.namespace": "default")使用了冒号分隔参数,属于Python语法错误。如果实际运行代码确实存在该问题,会导致Namespace配置不生效,Executor被调度到错误命名空间后无法找到Driver,直接退出。 - 命名空间资源配额不足
检查default命名空间的资源配额,确认剩余CPU、内存资源足够支撑2个1核1G的Executor实例。如果配额不足,K8s会强制杀掉超出配额的Pod,引发循环重建。
快速排查建议
直接拉取异常退出的Executor日志即可定位根因:
kubectl logs <异常退出的Executor Pod名称> -n default
如果日志报Driver连接超时,优先排查网络配置;如果报权限错误,优先排查RBAC配置;如果报类不存在、版本不匹配,优先排查镜像兼容性。
内容的提问来源于stack exchange,提问作者Avik Aggarwal
相关产品推荐
相关产品推荐

