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

Apache Spark on GKE部署后/opt/spark/work-dir文件丢失求助

问题根源分析

你的核心问题是Kubernetes卷挂载覆盖了镜像中原有的/opt/spark/work-dir目录:

  • 在SparkApplication YAML配置中,work-dir卷未指定类型,Kubernetes默认创建emptyDir临时空目录
  • 当driver、executor及init容器将该emptyDir卷挂载到/opt/spark/work-dir时,镜像中预先复制的文件被空目录完全覆盖,导致运行时找不到streams.zip等文件
排查验证步骤
  1. 检查卷定义:查看YAML的volumes段,work-dir无类型声明,默认是emptyDir临时空卷
  2. 确认init容器挂载结果:init容器执行ls -lrt /opt/spark/work-dir/返回total 0,证明挂载的是空卷而非镜像内的目录
  3. 追踪Spark报错:Spark尝试读取local:///opt/spark/work-dir/streams.zip,但该路径已被空卷覆盖,触发NoSuchFileException
修复方案

根据你的需求选择以下任一方案:

方案一:移除不必要的卷挂载(推荐,若无需运行时共享目录)

如果不需要在运行时对/opt/spark/work-dir进行持久化或跨容器共享,直接删除相关挂载配置即可:

  1. 删除driver.volumeMounts中的work-dir条目:
    # 移除这部分
    - name: work-dir
      mountPath: /opt/spark/work-dir
    
  2. 删除executor.volumeMounts中的work-dir条目:
    # 移除这部分
    - name: work-dir
      mountPath: /opt/spark/work-dir
    
  3. 删除volumes中的work-dir条目:
    # 移除这部分
    - name: work-dir    
    
  4. 重新提交SparkApplication,此时容器会直接使用镜像中原有的/opt/spark/work-dir目录,文件可正常访问

方案二:保留卷挂载并复制文件(若需运行时共享目录)

如果确实需要挂载卷到/opt/spark/work-dir,通过init容器将镜像中的文件复制到挂载卷:

  1. 修改init容器的配置,将镜像内的文件复制到挂载卷:
    initContainers:
      - name: init-copy-files
        image: "us-east1-docker.pkg.dev/versa-kafka-poc/spark-job-repo/ss-main-vkp:0.0.2"
        command: ["sh", "-c", "cp -r /opt/spark/work-dir/* /mnt/work-dir/ && ls -lrt /mnt/work-dir/"]
        volumeMounts:
          - name: work-dir
            mountPath: /mnt/work-dir
    
  2. 保持driver和executor的volumeMounts中work-dir挂载到/opt/spark/work-dir不变
  3. 重新提交后,init容器会先将镜像内的文件复制到emptyDir卷,后续driver/executor挂载该卷时就能访问到文件
额外注意事项
  • 确认mainApplicationFile配置正确,若main.py在镜像的/opt/spark/work-dir下,应设置为local:///opt/spark/work-dir/main.py
  • 检查deps.pyFiles路径是否与镜像内文件路径一致,确保Spark能正确找到依赖包

内容的提问来源于stack exchange,提问作者Karan Alang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:34:56