google dataproc - 图像版本 2.0.x 如何将 pyspark 版本降级到 3.0.1

问题描述

在 Google Cloud 中使用 dataproc 映像版本 2.0.x,因为此 dataproc 映像版本中提供了 delta 0.7.0。不过这个dataproc实例自带pyspark 3.1.1,Apache Spark 3.1.1还没有正式发布。所以目前还没有兼容3.1的Delta Lake版本,建议降级。

我已经尝试了以下,

pip install --force-reinstall pyspark==3.0.1 

在 dataproc 实例的主节点上以 root 用户身份执行上述命令,但是,当我检查 pyspark --version 时,它仍然显示 3.1.1

如何将认的 pyspark 版本修复为 3.0.1?

解决方法

使用带有 Dataproc 2.0 的 Spark 3.0 的最简单方法是在 newer Dataproc 2.0 image versions 中固定使用 Spark 3.0 之前使用 Spark 3.0 的旧版 Dataproc 2.0 映像版本 (2.0.0-RC22-debian10):

gcloud dataproc clusters create $CLUSTER_NAME --image-version=2.0.0-RC22-debian10
,

要使用 3.0.1 版本的 spark,您需要确保 Dataproc 集群中的主节点和工作节点在 /usr/lib/spark/jars 中有 spark-3.0.1 jar,而不是 3.1.1。>

有两种方法可以做到这一点:

  1. 手动将每个节点中的 3.0.1 jar 移动到 /usr/lib/spark/jars,并删除 3.1.1 的。在为所需版本的 pyspark 执行 pip install 后,您可以在 /.local/lib/python3.8/site-packages/pyspark/jars 中找到 spark jar。确保在此之后重新启动 spark: sudo systemctl restart spark*

  2. 您可以使用 dataproc init 操作 (https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/init-actions?hl=en) 来执行相同的操作,这样您就不必 ssh 每个节点并手动更改 jars。

步骤:

  1. 将更新后的 Hadoop jar 上传到 GCS 文件夹,例如 gs:///lib-updates,其结构与集群节点的 /usr/lib/ 目录相同。

  2. 编写一个初始化操作脚本,将更新从 GCS 同步到本地 /usr/lib/,然后重新启动 Hadoop 服务。将脚本上传到 GCS,例如 gs:///init-actions-update-libs.sh。

     #!/bin/bash
    
     set -o nounset
     set -o errexit
     set -o xtrace
     set -o pipefail
    
     # The GCS folder of lib updates.
    
     LIB_UPDATES=$(/usr/share/google/get_metadata_value attributes/lib-updates)
    
     # Sync updated libraries from $LIB_UPDATES to /usr/lib
    
     gsutil rsync -r -e $LIB_UPDATES /usr/lib/
    
     # Restart spark services
     service spark-* restart
    
  3. 使用 --initialization-actions $INIT_ACTIONS_UPDATE_LIBS 和 --metadata lib-updates=$LIB_UPDATES 创建集群。