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等文件
排查验证步骤
- 检查卷定义:查看YAML的
volumes段,work-dir无类型声明,默认是emptyDir临时空卷 - 确认init容器挂载结果:init容器执行
ls -lrt /opt/spark/work-dir/返回total 0,证明挂载的是空卷而非镜像内的目录 - 追踪Spark报错:Spark尝试读取
local:///opt/spark/work-dir/streams.zip,但该路径已被空卷覆盖,触发NoSuchFileException
修复方案
根据你的需求选择以下任一方案:
方案一:移除不必要的卷挂载(推荐,若无需运行时共享目录)
如果不需要在运行时对/opt/spark/work-dir进行持久化或跨容器共享,直接删除相关挂载配置即可:
- 删除
driver.volumeMounts中的work-dir条目:# 移除这部分 - name: work-dir mountPath: /opt/spark/work-dir - 删除
executor.volumeMounts中的work-dir条目:# 移除这部分 - name: work-dir mountPath: /opt/spark/work-dir - 删除
volumes中的work-dir条目:# 移除这部分 - name: work-dir - 重新提交SparkApplication,此时容器会直接使用镜像中原有的
/opt/spark/work-dir目录,文件可正常访问
方案二:保留卷挂载并复制文件(若需运行时共享目录)
如果确实需要挂载卷到/opt/spark/work-dir,通过init容器将镜像中的文件复制到挂载卷:
- 修改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 - 保持driver和executor的
volumeMounts中work-dir挂载到/opt/spark/work-dir不变 - 重新提交后,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
相关产品推荐
相关产品推荐

