Dataproc图像版本1.4-debian9(预览版)缺少AWS S3 jars(org.apache.hadoop.fs.s3a.S3AFileSystem)

问题描述 投票:2回答:1

使用图像版本1.3-debian9显示罐子可用(附截图)。

使用图像版本预览(1.4-debian9)给出以下错误消息(附带的屏幕截图):

Py4JJavaError: An error occurred while calling o60.load.
: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found

用于创建Dataproc集群的命令:

gcloudataproc clusters create ${CLUSTER_NAME} --bucket ${BUCKET} --zone us-east1-d --master-machine-type n1-standard-4 --master-boot-disk-size 1TB --num-workers 3 --worker-machine-type n1-standard-4 --worker-boot-disk-size 1TB --image-version=preview --scopes 'https://www.googleapis.com/auth/cloud-platform' --project ${PROJECT} --initialization-actions gs://dataproc-initialization-actions/python/pip-install.sh,gs://dataproc-initialization-actions/connectors/connectors.sh --metadata 'gcs-connector-version=1.9.16' --metadata 'bigquery-connector-version=0.13.16' --optional-components=ANACONDA,JUPYTER

截图:1.3-debian9 1.4-debian9

amazon-s3 google-cloud-platform google-cloud-dataproc
1个回答
3
投票

这与Hadoop 2.9.2, Spark 2.4.0 access AWS s3a bucket中描述的相同根本原因有关

特别是,在使用Spark 2.4的Dataproc 1.4中,Hadoop依赖项现在捆绑在/usr/lib/spark/lib下,通常这些依赖版本可能与/usr/lib/hadoop/lib/usr/lib/hadoop-mapreduce/lib等下的Hadoop类版本不同。这里的问题是一些辅助AWS连接器(也可能是Azure,等等连接器)之类的依赖关系默认情况下不会自动包含在Spark提供的lib目录中。

但是,该问题的答案都不是理想的。下载您自己版本的AWS jar文件可能会很麻烦,而且您可能也存在版本不兼容问题。或者,将完整的hadoop classpath添加到SPARK_DIST_CLASSPATH会污染您的Spark类路径以及完全重复的Hadoop依赖项集,这可能还会导致版本不兼容问题(并且会破坏包装Spark自己的Hadoop依赖项副本的更改)。

相反,您可以使用具有以下内容的Dataproc初始化操作:

#!/bin/bash
# Name this something like add-aws-classpath.sh

AWS_SDK_JAR=$(ls /usr/lib/hadoop-mapreduce/aws-java-sdk-bundle-*.jar | head -n 1)

cat << EOF >> /etc/spark/conf/spark-env.sh
SPARK_DIST_CLASSPATH="\${SPARK_DIST_CLASSPATH}:/usr/lib/hadoop-mapreduce/hadoop-aws.jar"
SPARK_DIST_CLASSPATH="\${SPARK_DIST_CLASSPATH}:${AWS_SDK_JAR}"
EOF

然后在群集创建时--initialization-actions=gs://mybucket/add-aws-classpath.sh使用它。

然后它应该再次工作。

一般来说,你可以从/usr/lib/hadoop-mapreduce/lib的内容中区分/usr/lib/spark/lib的内容;你应该看到像hadoop-mapreduce jar这样的东西存在于Dataproc 1.4中的Spark中,但不存在于1.3中。所以,如果你碰到任何其他缺少的罐子,你可以采取相同的方法来补充SPARK_DIST_CLASSPATH

默认情况下,Dataproc可能决定在未来的1.4补丁版本中修补此问题,但是使用init操作,无论底层系统是否也添加了这些类路径都应该是无害的。

© www.soinside.com 2019 - 2024. All rights reserved.