【问题标题】:Dataproc image version 1.4-debian9 (preview) missing AWS S3 jars (org.apache.hadoop.fs.s3a.S3AFileSystem)Dataproc 映像版本 1.4-debian9(预览版)缺少 AWS S3 jar (org.apache.hadoop.fs.s3a.S3AFileSystem)
【发布时间】:2019-04-03 13:17:25
【问题描述】:

使用图像版本 1.3-debian9 显示 jars 可用(附加屏幕截图)。

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

    这与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 下的 Hadoop 类版本不同或/usr/lib/hadoop-mapreduce/lib 等。这里的问题是某些辅助依赖项,如 AWS 连接器(可能还有 Azure 等连接器)默认情况下不会自动包含在 Spark 提供的 lib 目录中。

    但是,该问题的答案都不是理想的。下载您自己的 AWS jarfile 版本可能会很麻烦,而且您可能会遇到版本不兼容的问题。或者,将完整的 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 中没有。因此,如果您遇到任何其他丢失的 jar,您可以采用相同的方法来补充 SPARK_DIST_CLASSPATH

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2023-04-06
      • 2017-10-21
      • 1970-01-01
      • 2011-12-21
      相关资源
      最近更新 更多