You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交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-user SA拥有足够权限,执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:29:53