on-k8s-operator在kubernetes上运行pyspark的docker依赖问题

kqhtkvqz  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(443)

我花了几天的时间试图找出一个依赖性问题,我正在kubernetes上运行(py)spark。我使用的是spark-on-k8s-operator和spark的google云连接器。
当我试图提交我的Spark工作没有依赖使用 sparkctl create sparkjob.yaml ... 使用below.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,随后从那里获取并在启动应用程序时复制到驱动程序pod中。每当我想提供自己的python模块时,问题就开始了 deps.zip 作为一个依赖项,可以在我的主应用程序文件中使用它 sparkjob.py .
以下是我迄今为止尝试过的:
1
在sparkjob.yaml中向spark.deps添加了以下行

pyFiles:
   - ./deps.zip

这导致操作员甚至无法提交错误的spark应用程序

java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem not found
``` `./deps.zip` 与主应用程序文件一起成功上载到gcs bucket,但主应用程序文件可以从gcs成功获取(我在没有上述依赖关系的jobs日志中看到这一点), `./deps.zip` 不知何故不能从那里取来。我还尝试显式地将gcs连接器jar添加到spark.deps.jars列表中-没有任何变化。
2
我补充道 `./deps.zip` 通过添加 `COPY ./deps.zip /mnt/` 添加到上面的dockerfile,并在sparkjob.yaml中通过

pyFiles:
- local:///mnt/deps.zip

这一次的Spark作业可以提交和驱动吊舱开始,但我得到了一个 `file:/mnt/deps.zip not found` 初始化spark上下文时出错,我还尝试另外设置 `ENV SPARK_EXTRA_CLASSPATH=/mnt/` 但没有任何成功。我甚至试着把整个 `/mnt/` 目录到驱动程序和执行器吊舱使用卷装载,但这也没有工作。
编辑:
我的解决方法(2),向docker映像和设置添加依赖项 `ENV SPARK_EXTRA_CLASSPATH=/mnt/` 在dockerfile里真的有用!原来标签没有更新,我一直在使用老版本的docker图像。嗯。
我仍然不知道为什么通过gcs连接器的(更优雅的)解决方案1不起作用,但它可能与mountvolume.setup为volume“spark conf volume”失败有关
o3imoua4

o3imoua41#

使用google云存储路径访问python依赖项,因为它们是上传到那里的。

spec:
  deps:
    pyFiles:
      - gs://gcs-bucket-name/deps.zip

相关问题