Spark on Kubernetes环境升级Spark 3.5.1自定义镜像运行PySpark任务报错求助
看起来你是在升级Spark版本到3.5.1后踩了老版本兼容的坑,我来帮你拆解下问题根源和解决思路:
问题根源分析
你之前为了兼容老镜像里的driver-py命令,给spark-submit做了软链接,但老版本的driver-py是个封装脚本——它会读取PYSPARK_PRIMARY环境变量来自动加载应用文件,而原生的spark-submit根本不认这个变量!
从你贴的Pod日志里的启动参数就能看出来:
driver-py --properties-file /opt/spark/conf/spark.properties --class org.apache.spark.deploy.PythonRunner
这里完全没把你的test.py路径作为参数传进去,spark-submit自然会报“缺少应用资源”的错误。
具体解决步骤
1. 废弃driver-py兼容方案,回归原生Spark-submit
先把Dockerfile里的软链接命令删掉:
# 删掉这一行:RUN ln -s /opt/spark/bin/spark-submit /usr/bin/driver-py
Spark 3.x的K8s Operator完全不需要依赖老版本的driver-py,强行模拟反而会破坏原生参数传递逻辑。
2. 修正Python版本冲突
从Pod的环境变量里看到PYSPARK_MAJOR_PYTHON_VERSION: 2,但你的镜像用的是Python3(基于apache/spark:3.5.1-java17-python3),这会导致Spark错误调用Python2,和你安装的Python3包冲突!
在Dockerfile里添加这个环境变量:
ENV PYSPARK_MAJOR_PYTHON_VERSION=3
3. 修正SparkApplication配置细节
- 调整应用文件路径前缀:把
mainApplicationFile: "file:///maprfs-csi/test.py"改成local:///maprfs-csi/test.py,K8s集群模式下local://是Spark官方推荐的容器内本地文件路径前缀,file://容易出现解析问题。 - 显式指定启动参数(可选):如果Spark Operator还是默认调用旧命令,可以在driver配置里直接指定spark-submit和应用路径:
driver: cores: 1 coreLimit: "1000m" memory: "8g" command: ["/opt/spark/bin/spark-submit"] args: - "--properties-file" - "/opt/spark/conf/spark.properties" - "--class" - "org.apache.spark.deploy.PythonRunner" - "/maprfs-csi/test.py" # 其他原有配置不变
这样就能直接把应用文件路径作为参数传给spark-submit,彻底绕开环境变量兼容问题。
- 检查Operator版本兼容性:你用的是
sparkoperator.k8s.io/v1beta2,要确认这个版本的Spark Operator是否支持Spark 3.5.1,老Operator可能存在版本适配问题,必要时升级到对应支持的Operator版本。
4. 镜像优化(可选但推荐)
你的镜像里重复安装了pyspark==3.5.1,但基于的apache/spark:3.5.1-java17-python3已经自带了对应版本的PySpark,重复安装可能导致版本冲突,建议把pip install里的pyspark==3.5.1删掉,减少镜像体积和潜在问题。
验证步骤
- 重新构建镜像,应用上述Dockerfile修改。
- 提交修改后的SparkApplication YAML。
- 启动后查看driver Pod的启动参数,确认已经包含
/maprfs-csi/test.py路径。 - 如果还有问题,直接进入driver Pod容器,执行
spark-submit /maprfs-csi/test.py,测试文件是否能正常运行,排除路径或权限问题。
按照这个思路调整,应该就能解决当前的“Missing application resource”错误了,要是还有其他细节问题,随时补充我再帮你排查!




