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

时间:2019-04-03 13:17:26

标签: amazon-s3 google-cloud-platform google-cloud-dataproc

使用1.3-debian9版本的图像显示jar可用(随附的屏幕截图)。

使用图像版本预览(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

1 个答案:

答案 0 :(得分:3)

这与Hadoop 2.9.2, Spark 2.4.0 access AWS s3a bucket

中所述的根本原因有关

尤其是在使用Spark 2.4的Dataproc 1.4中,现在将Hadoop依赖项捆绑在/usr/lib/spark/lib下,并且通常这些依赖项版本 可能不同于{ {1}}或/usr/lib/hadoop/lib等。这里的问题是,默认情况下,某些辅助依赖项(例如AWS连接器(可能还有Azure等连接器))不会自动包含在Spark提供的lib dir中。 / p>

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

相反,您可以通过以下方式使用Dataproc初始化操作:

SPARK_DIST_CLASSPATH

然后在群集创建时间#!/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的内容进行区分;您应该看到在Dataproc 1.4中Spark中存在hadoop-mapreduce jar之类的东西,而在1.3中则没有。因此,如果遇到其他丢失的jar,可以采用相同的方法来补充/usr/lib/spark/lib

Dataproc可能决定默认在1.4的将来修补程序版本中对此进行修补,但是使用init操作,基础系统是否也添加这些类路径应该是无害的。