使用dataproc image 2.0版本。由于delta 0.7.0在这个dataproc映像版本中可用。但是,这个dataproc实例是pyspark 3.1.1默认的,Apache Spark 3.1.1还没有正式发布。因此Delta Lake没有与3.1兼容的版本,因此建议降级。
我已经试过了,
pip install --force-reinstall pyspark==3.0.1
在dataproc实例的主节点上作为根用户执行了上述命令,但是,当我检查pyspark --version
时,它仍然显示3.1.1
如何修复默认的pyspark版本为3.0.1?
使用Spark 3.0 w/Dataproc 2.0的最简单方法是固定使用旧的Dataproc 2.0映像版本(2.0.0-RC22-debian10
),该版本使用Spark 3.0,然后在更新的Dataproc 2.0映像版本中升级到Spark 3.1:
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 jar。
有两种方法:
-
将每个节点中的3.0.1 jar手动移动到/usr/lib/spark/jars,并删除3.1.1 jar。在对所需版本的pyspark执行pip安装后,您可以在/.local/lib/python3.8/site-packages/pyspark/jars中找到spark jar。sudo systemctl restart spark*
-
您可以使用dataproc init actions (https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/init-actions?hl=en)来完成相同的操作,这样您就不必ssh每个节点并手动更改jar。
步骤:
-
将更新后的Hadoop jar文件上传到GCS文件夹,例如:gs:///lib-updates,其结构与集群节点的/usr/lib/目录相同。
-
写一个init actions脚本,从GCS同步更新到本地/usr/lib/,然后重启Hadoop服务。将脚本上传到GCS,例如:gs:///init-actions-update-lib .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
-
用——initialization-actions $INIT_ACTIONS_UPDATE_LIBS和——metadata lib-updates=$LIB_UPDATES创建集群