我正在尝试使用 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
接下来,我使用此 YAML 文件部署 Spark 应用程序:
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"
但是,当我描述驱动程序容器或检查其日志时,我看到以下错误:
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
我尝试过的事情
我通过将 Spark 应用程序 JAR 文件复制到的目录更改为 /opt/bitnami/spark/examples/jars/ 解决了该问题。
这是更新后的 Dockerfile: 来自 bitnami/spark:3.5.3
复制目标/scala-2.12/qupid-deequ- assembly-0.1.0-SNAPSHOT.jar /opt/bitnami/spark/examples/jars/
用户根 运行 chmod -R 777 /opt
暴露8080
Spark Operator 或 Bitnami Spark 映像似乎具有特定的默认配置或应用程序 JAR 文件的预期位置,即 /opt/bitnami/spark/examples/jars/。进行此更改后,驱动程序能够毫无问题地找到 JAR 文件。
如果有人深入了解为什么需要此特定目录或将其记录为此图像中 Spark 应用程序的默认目录,我有兴趣了解更多信息!