gpt4 book ai didi

docker - 使用 spark-on-k8s-operator 在 Kubernetes 上运行的 Pyspark 的依赖性问题

转载 作者:行者123 更新时间:2023-12-02 11:30:51 26 4
gpt4 key购买 nike

我花了几天时间试图找出在 Kubernetes 上运行 (Py)Spark 时遇到的依赖问题。我正在使用 spark-on-k8s-operator和 Spark 的 Google Cloud 连接器。
当我尝试提交我的 Spark 作业时 没有 使用 sparkctl create sparkjob.yaml ... 的依赖项使用下面的 .yaml 文件,它就像一个魅力。

apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: spark-job
namespace: my-namespace
spec:
type: Python
pythonVersion: "3"
hadoopConf:
"fs.gs.impl": "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem"
"fs.AbstractFileSystem.gs.impl": "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS"
"fs.gs.project.id": "our-project-id"
"fs.gs.system.bucket": "gcs-bucket-name"
"google.cloud.auth.service.account.enable": "true"
"google.cloud.auth.service.account.json.keyfile": "/mnt/secrets/keyfile.json"
mode: cluster
image: "image-registry/spark-base-image"
imagePullPolicy: Always
mainApplicationFile: ./sparkjob.py
deps:
jars:
- https://repo1.maven.org/maven2/org/apache/spark/spark-sql-kafka-0-10_2.11/2.4.5/spark-sql-kafka-0-10_2.11-2.4.5.jar
sparkVersion: "2.4.5"
restartPolicy:
type: OnFailure
onFailureRetries: 3
onFailureRetryInterval: 10
onSubmissionFailureRetries: 5
onSubmissionFailureRetryInterval: 20
driver:
cores: 1
coreLimit: "1200m"
memory: "512m"
labels:
version: 2.4.5
serviceAccount: spark-operator-spark
secrets:
- name: "keyfile"
path: "/mnt/secrets"
secretType: GCPServiceAccount
envVars:
GCS_PROJECT_ID: our-project-id
executor:
cores: 1
instances: 1
memory: "512m"
labels:
version: 2.4.5
secrets:
- name: "keyfile"
path: "/mnt/secrets"
secretType: GCPServiceAccount
envVars:
GCS_PROJECT_ID: our-project-id
Docker 镜像 spark-base-image使用 Dockerfile 构建
FROM gcr.io/spark-operator/spark-py:v2.4.5

RUN rm $SPARK_HOME/jars/guava-14.0.1.jar
ADD https://repo1.maven.org/maven2/com/google/guava/guava/28.0-jre/guava-28.0-jre.jar $SPARK_HOME/jars

ADD https://repo1.maven.org/maven2/com/google/cloud/bigdataoss/gcs-connector/hadoop2-2.0.1/gcs-connector-hadoop2-2.0.1-shaded.jar $SPARK_HOME/jars

ENTRYPOINT [ "/opt/entrypoint.sh" ]
主应用程序文件在提交应用程序时上传到 GCS,然后在启动应用程序时从那里获取并复制到驱动程序 Pane 中。每当我想提供自己的 Python 模块 deps.zip 时,问题就开始了作为能够在我的主应用程序文件 sparkjob.py 中使用它的依赖项.
这是我到目前为止所尝试的:
1
在 sparkjob.yaml 中的 spark.deps 中添加了以下行
pyFiles:
- ./deps.zip
这导致运算符(operator)甚至无法通过错误提交 Spark 应用程序
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem not found
./deps.zip与主应用程序文件一起成功上传到 GCS 存储桶,但可以从 GCS 成功获取主应用程序文件(我在作业日志中看到这一点,没有上述定义的依赖项), ./deps.zip无法从那里获取。我还尝试将 gcs-connector jar 显式添加到 spark.deps.jars 列表中 - 没有任何变化。
2
我添加了 ./deps.zip通过添加 COPY ./deps.zip /mnt/ 到用于启动驱动程序和执行程序 pod 的基本 docker 镜像到上面的 Dockerfile 并通过在 sparkjob.yaml 中添加依赖项
pyFiles:
- local:///mnt/deps.zip
这次可以提交 spark 作业并启动驱动程序 pod,但是我得到一个 file:/mnt/deps.zip not found初始化 Spark 上下文时出错
我还尝试另外设置 ENV SPARK_EXTRA_CLASSPATH=/mnt/在 Dockerfile 但没有任何成功。我什至尝试显式挂载整个 /mnt/使用卷挂载将目录放入驱动程序和执行程序 pod,但这也不起作用。

编辑:
我的解决方法(2),将依赖项添加到 Docker 镜像并设置 ENV SPARK_EXTRA_CLASSPATH=/mnt/在 Dockerfile 中确实有效!原来标签没有更新,我一直在使用旧版本的 Docker 镜像。呃。
我仍然不知道为什么通过 gcs-connector 的(更优雅的)解决方案 1 不起作用,但它可能与 MountVolume.Setup failed for volume "spark-conf-volume" 有关

最佳答案

如果 zip 文件包含运行 spark 作业时始终需要的 jar,则面临我刚刚添加的类似问题

FROM gcr.io/spark-operator/spark-py:v2.4.5
COPY mydepjars/ /opt/spark/jars/
一切都在我的 spark session 中加载。可能是一种方法。

关于docker - 使用 spark-on-k8s-operator 在 Kubernetes 上运行的 Pyspark 的依赖性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62448894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com