AKS上运行Spark 3.5.0示例作业遇NoSuchFileException问题求助
1. 修正类名参数错误
你的--class参数写错了,正确的类名是org.apache.spark.examples.sql.JavaSparkSQLExample,而非main.java.org.apache.spark.examples.sql.JavaSparkSQLExample。Spark官方示例的包路径没有main.java前缀,这个错误会直接导致找不到目标类,同时可能伴随文件找不到的连锁异常。
2. 验证镜像中Jar包是否存在
步骤1:本地检查镜像内容
执行以下命令确认镜像中是否包含目标Jar包:
docker run --rm mycontainerregistry.azurecr.io/mycustomsparkimage:latest ls /opt/spark/examples/jars/
如果输出中没有spark-examples_2.12-3.5.0.jar,说明构建镜像时未正确复制文件,问题出在构建上下文:
- 官方Dockerfile要求从Spark发行版的根目录执行构建命令。请下载并解压Spark 3.5.0发行包(如
spark-3.5.0-bin-hadoop3.tgz),进入解压后的根目录,再执行构建:
cd spark-3.5.0-bin-hadoop3 docker build -t mycustomsparkimage:latest -f kubernetes/dockerfiles/spark/Dockerfile .
- 重新推送镜像到ACR:
docker push mycontainerregistry.azurecr.io/mycustomsparkimage:latest
步骤2:检查Jar包权限
确认镜像中Jar包的权限允许185用户读取:
docker run --rm mycontainerregistry.azurecr.io/mycustomsparkimage:latest ls -l /opt/spark/examples/jars/spark-examples_2.12-3.5.0.jar
如果权限不足,在Dockerfile中COPY examples之后添加以下命令,赋予全局读权限:
RUN chmod -R a+r /opt/spark/examples
3. 调整Spark部署方式(关键)
你当前用Kubernetes Deployment运行Spark Cluster模式,不符合Spark on Kubernetes的设计规范。Spark本身会通过spark-submit自动管理Driver和Executor Pod的生命周期,手动编写Deployment会破坏Spark的K8s集成逻辑。
推荐做法:使用spark-submit提交作业
在能访问AKS集群的机器上(如本地开发机或AKS节点),执行以下命令提交作业:
/opt/spark/bin/spark-submit \ --verbose \ --master k8s://https://sparkakscluster-dns-5i9mchtu.hcp.westeurope.azmk8s.io:443 \ --deploy-mode cluster \ --conf spark.kubernetes.namespace=spark-sql-proto \ --conf spark.kubernetes.container.image.pullPolicy=Always \ --conf spark.executor.instances=5 \ --conf spark.driver.memory=3G \ --conf spark.executor.memory=3G \ --conf spark.kubernetes.submission.waitAppCompletion=true \ --conf spark.kubernetes.driverEnv.HTTP2_DISABLE=true \ --name spark-proto-app \ --conf spark.kubernetes.container.image=mycontainerregistry.azurecr.io/mycustomsparkimage:latest \ --class org.apache.spark.examples.sql.JavaSparkSQLExample \ local:///opt/spark/examples/jars/spark-examples_2.12-3.5.0.jar
注意:使用local://而非file://,这是Spark on K8s引用容器本地文件的规范写法。
如果坚持使用Deployment(不推荐)
需调整以下参数:
- 移除
--deploy-mode cluster,改用client模式(因为Deployment已启动Driver容器) - 配置
spark.driver.host和spark.driver.port确保Executor能连接到Driver - 这种方式会失去Spark自动管理Executor的能力,不建议生产环境使用
4. 排查Pod日志定位问题
若问题仍存在,查看Driver Pod日志获取详细错误信息:
kubectl logs -n spark-sql-proto <driver-pod-name>
日志会明确显示是文件不存在、类找不到还是权限问题,帮助进一步定位。
内容的提问来源于stack exchange,提问作者M G

