Spark2.3.0应用提交K8s(Minikube)容器启动报错:driver可执行文件未找到
解决Spark on Kubernetes中"exec: "driver": executable file not found in $PATH"错误
这个错误是集群模式下Spark驱动容器启动失败的典型问题,根源在于你指定的自定义镜像docker.io/anantpukale/spark_app:1.3没有正确配置Spark在Kubernetes环境下的启动入口——K8s尝试执行名为driver的可执行文件,但它不在容器的$PATH里,也没有正确存在于镜像中。下面是几种针对性的解决方法:
方法1:基于官方Spark镜像构建应用镜像(推荐)
官方Spark镜像已经预先配置好了K8s所需的driver和executor启动脚本,以及正确的环境变量,是最省心的方案:
编写如下
Dockerfile:# 使用与你的Spark版本完全匹配的官方镜像(这里是2.3.0) FROM spark:2.3.0 # 将你的应用jar包复制到镜像内的指定目录,比如/app COPY CashFlow-spark2.3.0-shaded.jar /app/构建镜像并确保Minikube能访问到它:
- 如果是本地测试,先执行
eval $(minikube docker-env),让Docker直接把镜像构建到Minikube的本地Docker环境中,无需推送到远程仓库:eval $(minikube docker-env) docker build -t anantpukale/spark_app:1.4 . # 这里版本号可以更新一下
- 如果是本地测试,先执行
修改你的spark-submit命令,确保
local://路径指向镜像内的jar包绝对路径:/opt/spark/bin/spark-submit \ --master k8s://https://192.168.99.101:8443 \ --name cfe2 \ --deploy-mode cluster \ --class com.yyy.Application \ --conf spark.executor.instances=1 \ --conf spark.kubernetes.container.image=docker.io/anantpukale/spark_app:1.4 \ local:///app/CashFlow-spark2.3.0-shaded.jar
方法2:手动配置自定义基础镜像
如果你必须使用自己的基础镜像(比如基于OpenJDK),需要手动安装Spark并配置环境变量:
编写
Dockerfile,确保Spark的bin目录加入$PATH:# Spark 2.3.0需要Java 8环境,所以选择对应版本的JRE镜像 FROM openjdk:8-jre # 下载并解压Spark 2.3.0(注意匹配Hadoop版本,这里用hadoop2.7) RUN wget https://archive.apache.org/dist/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2.7.tgz && \ tar -xzf spark-2.3.0-bin-hadoop2.7.tgz && \ mv spark-2.3.0-bin-hadoop2.7 /opt/spark && \ rm spark-2.3.0-bin-hadoop2.7.tgz # 将Spark的bin目录加入环境变量PATH ENV PATH="/opt/spark/bin:${PATH}" # 复制你的应用jar包 COPY CashFlow-spark2.3.0-shaded.jar /app/同样按照方法1的步骤构建镜像、更新spark-submit命令即可。
关键注意点
- 集群模式下,
local://指向的是驱动容器内部的路径,必须是jar包在镜像中的绝对路径(三个斜杠:local:///app/xxx.jar),否则会找不到jar包。 - 确保Minikube能拉取到你的镜像:本地构建时一定要先执行
eval $(minikube docker-env),否则Minikube会去远程仓库拉取,导致镜像不存在的错误。
内容的提问来源于stack exchange,提问作者Anant Pukale
相关产品推荐
相关产品推荐

