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

Kubernetes Spark Operator无法找到镜像中的JAR文件

问题:Kubernetes Spark Operator部署时驱动Pod找不到镜像中的JAR文件

我尝试使用Kubernetes Spark Operator部署SparkApplication,为Spark任务构建了自定义Docker镜像,但遇到驱动Pod无法找到镜像中应包含的JAR文件的问题。

Dockerfile内容

FROM bitnami/spark:3.5.3

WORKDIR /opt/spark/work-dir

COPY target/scala-2.12/app.jar /opt/spark/work-dir/

USER root
RUN chmod 777 /opt/spark/work-dir/app.jar

EXPOSE 8080

镜像构建与推送命令

docker buildx build --platform=linux/amd64 -t repo/image:TAG .
docker push repo/image:TAG

本地验证镜像

通过以下命令进入镜像容器:

docker run --rm -it repo/image:TAG /bin/bash

确认JAR文件存在:

-> pwd
/opt/spark/work-dir
-> ls
app.jar

SparkApplication部署YAML

apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: $APP
  namespace: $NAMESPACE
spec:
  type: Scala
  mode: cluster
  image: repo/image:TAG
  imagePullPolicy: Always
  mainClass: com.org.app.api.Api
  mainApplicationFile: "local:///opt/spark/work-dir/app.jar"
  sparkVersion: "3.5.3"
  driver:
    cores: 2
    memory: "2G"
    serviceAccount: spark
  executor:
    cores: 4
    instances: 2
    memory: "4G"
  sparkConf:
    "spark.kubernetes.container.image.pullPolicy": "Always"
    "spark.kubernetes.namespace": "namespace-name"

错误信息

驱动Pod日志中出现如下错误:

Files local:///opt/spark/work-dir/app.jar from /opt/spark/work-dir/app.jar to /opt/spark/work-dir/app.jar
Exception in thread "main" java.nio.file.NoSuchFileException: /opt/spark/work-dir/app.jar

已尝试的解决方法

  • 验证Docker镜像内存在JAR文件(通过docker run确认)。
  • 确保SparkApplication YAML中的mainApplicationFile指向正确路径(local:///opt/spark/work-dir/app.jar)。
  • 使用linux/amd64平台构建镜像,避免架构不匹配(我的Kubernetes集群运行在AMD64节点上)。
  • 设置imagePullPolicy: Always以确保Kubernetes拉取最新镜像。
  • 为镜像添加ENTRYPOINT构建。

可能的解决方案

1. 修正镜像用户权限配置

Bitnami Spark镜像默认使用spark用户运行,你在Dockerfile中切换到root修改权限后未切回原用户,可能导致Spark运行时权限不足无法访问文件。修改Dockerfile:

FROM bitnami/spark:3.5.3

WORKDIR /opt/spark/work-dir

COPY target/scala-2.12/app.jar /opt/spark/work-dir/

USER root
RUN chmod 777 /opt/spark/work-dir/app.jar
# 切回spark用户
USER spark

EXPOSE 8080

2. 检查Pod是否有卷覆盖目标目录

执行命令查看驱动Pod的卷挂载情况,确认是否有外部卷覆盖了/opt/spark/work-dir:

kubectl describe pod <driver-pod-name> -n <namespace>

如果发现emptyDir或其他卷挂载到该路径,会覆盖镜像中的文件,需调整YAML中的卷配置。

3. 简化mainApplicationFile路径写法

由于Dockerfile已设置WORKDIR为/opt/spark/work-dir,尝试使用相对路径:

mainApplicationFile: "local://./app.jar"

4. 将JAR放入Spark默认扫描目录

Bitnami Spark会自动扫描/opt/spark/jars目录,可将JAR复制到该目录:

FROM bitnami/spark:3.5.3

COPY target/scala-2.12/app.jar /opt/spark/jars/

USER root
RUN chmod 777 /opt/spark/jars/app.jar
USER spark

EXPOSE 8080

此时YAML中可省略mainApplicationFile(或填写local:///opt/spark/jars/app.jar)。

5. 验证节点上的镜像内容

在Kubernetes节点上手动拉取镜像并检查文件是否存在,排除镜像推送失败或节点缓存问题:

docker pull repo/image:TAG
docker run --rm repo/image:TAG ls /opt/spark/work-dir

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:53:08