提交Spark任务到K8s后Executor Pod反复创建删除问题求助
Spark on Kubernetes Executor Pod 反复创建删除的问题排查
问题场景
通过Airflow的KubernetesPodOperator提交Spark任务,Driver Pod成功创建并启动,但Executor Pod陷入“创建→删除→再创建”的循环。Driver日志显示反复请求删除不存在的Executor,同时持续申请新的Executor实例:
提交任务的Airflow代码
spark_submit = KubernetesPodOperator( task_id='test_spark_k8s_submit', name='test_spark_k8s_submit', namespace='dev-spark', image='docker.io/vinhlq9/bitnami-spark-3.3', cmds=['/opt/spark/bin/spark-submit'], arguments=[ '--master', k8s_url, '--deploy-mode', 'cluster', '--name', 'spark-job', '--conf', 'spark.kubernetes.namespace=dev-spark', '--conf', 'spark.kubernetes.container.image=docker.io/vinhlq9/bitnami-spark-3.3', '--conf', 'spark.kubernetes.authenticate.driver.serviceAccountName=spark-user', '--conf', 'spark.kubernetes.authenticate.executor.serviceAccountName=spark-user', '--conf', 'spark.kubernetes.driverEnv.SPARK_CONF_DIR=/opt/bitnami/spark/conf', '--conf', 'spark.kubernetes.driverEnv.SPARK_CONFIG_MAP=spark-config', '--conf', 'spark.kubernetes.file.upload.path=/opt/spark', '--conf', 'spark.kubernetes.driver.annotation.sidecar.istio.io/inject=false', '--conf', 'spark.kubernetes.executor.annotation.sidecar.istio.io/inject=false', '--conf', 'spark.eventLog.enabled=true ', '--conf', 'spark.eventLog.dir=oss://spark/spark-log/', '--conf', 'spark.hadoop.fs.oss.accessKeyId=' + spark_user_access_key , '--conf', 'spark.hadoop.fs.oss.accessKeySecret=' + spark_user_secret_key, '--conf', 'spark.hadoop.fs.oss.endpoint=' + spark_user_endpoint, '--conf', 'spark.hadoop.fs.oss.impl=org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem', '--conf', 'spark.executor.instances=1', '--conf', 'spark.executor.memory=4g', '--conf', 'spark.executor.cores=2', '--conf', 'spark.driver.memory=2g', 'oss://spark/job/test_spark_k8s_job_simple.py' ], is_delete_operator_pod=True, config_file='/opt/airflow/plugins/k8sconfig-spark-user.json', get_logs=True, dag=dag )
Driver关键日志
23/05/16 08:40:21 INFO BlockManagerMaster: Removal of executor 1 requested 23/05/16 08:40:21 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asked to remove non-existent executor 1 23/05/16 08:40:21 INFO ExecutorPodsAllocator: Going to request 1 executors from Kubernetes for ResourceProfile Id: 0, target: 1, known: 0, sharedSlotFromPendingPods: 2147483647.
Executor循环日志
23/05/16 08:40:25 INFO BlockManagerMaster: Removal of executor 2 requested 23/05/16 08:40:25 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asked to remove non-existent executor 2 23/05/16 08:40:27 INFO ExecutorPodsAllocator: Going to request 1 executors from Kubernetes for ResourceProfile Id: 0, target: 1, known: 0, sharedSlotFromPendingPods: 2147483647.
排查思路
1. 抓取Executor Pod的启动失败细节
- 执行
kubectl describe pod <executor-pod-name>查看Pod事件,重点关注Events板块:是否存在镜像拉取失败、资源不足(Insufficient memory/cpu)、权限拒绝(Forbidden)等明确提示 - 用
kubectl logs <executor-pod-name> --previous查看已删除Pod的日志,Executor启动失败通常会抛出具体错误,比如无法连接Driver、无法拉取OSS任务脚本、依赖缺失等
2. 验证Driver与Executor的网络连通性
- 确认Driver Service(格式为
spark-job-<driver-id>-driver-svc)状态正常,执行kubectl get svc -n dev-spark检查是否存在且端口配置正确 - 检查K8s集群网络策略,确认未阻止Executor访问Driver的7078(SparkDriver服务端口)和7079(NettyBlockTransferService端口)
- 验证Istio sidecar注入已关闭:执行
kubectl get pod <executor-pod-name> -n dev-spark -o jsonpath='{.metadata.annotations.sidecar\.istio\.io/inject}',返回值应为false
3. 检查Spark配置合理性
- OSS配置验证:Executor启动需拉取OSS上的任务脚本,同时要写入事件日志到OSS。确认
spark.hadoop.fs.oss.*配置的accessKey、endpoint正确,且Executor所在节点能访问OSS endpoint - 文件上传路径权限:
spark.kubernetes.file.upload.path=/opt/spark,Bitnami镜像中/opt/spark目录所有者可能不是spark用户,导致无法写入临时文件,建议替换为/tmp/spark-uploads(临时目录默认有读写权限) - ServiceAccount权限:确认
spark-userSA拥有足够权限,执行kubectl auth can-i create pods -n dev-spark --as=system:serviceaccount:dev-spark:spark-user验证是否能在dev-spark命名空间下创建Pod
4. 检查资源配置是否过载
- 确认K8s节点有足够资源分配给Executor:
spark.executor.memory=4g+spark.executor.cores=2,检查节点可用内存和CPU是否满足,避免Pod因资源不足被调度器驱逐 - 检查Driver内存是否足够:
spark.driver.memory=2g如果过小,可能导致Driver无法处理Executor注册请求,进而触发Executor被标记为异常并删除
5. 排查Bitnami镜像特殊配置
- 检查
/opt/bitnami/spark/conf/spark-env.sh中的自定义配置,是否存在错误的环境变量(比如JAVA_HOME、SPARK_HOME设置错误) - 替换官方镜像测试:用
apache/spark:3.3.2替换Bitnami镜像,排除镜像本身的配置问题
内容的提问来源于stack exchange,提问作者Vinh Lai
相关产品推荐
相关产品推荐

