gpt4 book ai didi

apache-spark - 无法使用 Spark 2.2 访问 S3 数据

转载 作者:行者123 更新时间:2023-12-01 23:42:42 24 4
gpt4 key购买 nike

我将大量数据上传到我想要的 S3 存储桶,以便使用 Spark 和 Zeppelin 进行分析/可视化。然而,我仍然坚持从 S3 加载数据。

我做了一些阅读,以便将它们整合在一起,并免除我血腥的细节。我正在使用 docker 容器 p7hb/docker-spark作为 Spark 安装和我从 S3 读取数据的基本测试派生 from here :

  • 我启动容器以及其中的主进程和从进程。我可以通过查看暴露在端口 8080 上的 Spark Master WebUI 来验证这项工作。此页面确实列出了工作人员并在标题“已完成的应用程序”下保留了我所有失败尝试的日志。所有这些都在状态FINISHED .
  • 我开一个bash在该容器内并执行以下操作:

    a) 导出环境变量 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY ,如建议 here .

    b) 开始 spark-shell .为了访问 S3,似乎需要加载一些额外的包。浏览SE我特别发现this ,它教会了我,我可以使用 --packages加载所述包的参数。基本上我运行 spark-shell --packages com.amazonaws:aws-java-sdk:1.7.15,org.apache.hadoop:hadoop-aws:2.7.5 (,对于版本的任意组合)。

    c) 我运行以下代码
    sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3-eu-central-1.amazonaws.com")sc.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")sc.hadoopConfiguration.set("com.amazonaws.services.s3.enableV4", "true")val sonnets=sc.textFile("s3a://my-bucket/my.file")val counts = sonnets.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)

  • 然后我收到各种不同的错误消息,具体取决于我在 2b) 中选择的版本。

    我想 2a)、b/c 没有问题,我收到错误消息 Unable to load AWS credentials from any provider in the chain如果我不提供这些。 This is a known error new users seem to make.

    在尝试解决这个问题时,我从 here 中选择了或多或少的随机版本。和 there对于两个额外的包裹。我在 SE 的某个地方读到 hadoop-aws:2.7 应该是正确的选择,因为 Spark 2.2 基于 Hadoop 2.7。据说需要将 aws-java-sdk:1.7 与该版本的 hadoop-aws 一起使用。

    任何!我尝试了以下组合
  • --packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.1 ,这会产生常见的错误请求 400 错误。
    许多问题都可能导致该错误,如上所述,我的尝试包含了我在此页面上能够找到的所有内容。上面的描述包含s3-eu-central-1.amazonaws.com作为端点,而其他地方使用 s3.eu-central-1.amazonaws.com .根据 enter link description here ,两个端点名称都应该有效。我确实尝试了两者。
  • --packages com.amazonaws:aws-java-sdk:1.7.15,org.apache.hadoop:hadoop-aws:2.7.5 ,在这两种情况下都是最新的微型版本,我收到错误消息 java.lang.NoSuchMethodError: com.amazonaws.services.s3.transfer.TransferManager.<init>(Lcom/amazonaws/services/s3/AmazonS3;Ljava/util/concurrent/ThreadPoolExecuto
    r;)V
  • --packages com.amazonaws:aws-java-sdk:1.11.275,org.apache.hadoop:hadoop-aws:2.7.5 , 我也收到 java.lang.NoSuchMethodError: com.amazonaws.services.s3.transfer.TransferManager.<init>(Lcom/amazonaws/services/s3/AmazonS3;Ljava/util/concurrent/ThreadPoolExecutor;)V
  • --packages com.amazonaws:aws-java-sdk:1.11.275,org.apache.hadoop:hadoop-aws:2.8.1 , 我得到 java.lang.IllegalAccessError: tried to access method org.apache.hadoop.metrics2.lib.MutableCounterLong.<init>(Lorg/apache/hadoop/metrics2/MetricsInfo;J)V from class org.apache.hadoop.fs.s3a.S3AInstrumentation
  • --packages com.amazonaws:aws-java-sdk:1.11.275,org.apache.hadoop:hadoop-aws:2.8.3 , 我也收到 java.lang.IllegalAccessError: tried to access method org.apache.hadoop.metrics2.lib.MutableCounterLong.<init>(Lorg/apache/hadoop/metrics2/MetricsInfo;J)V from class org.apache.hadoop.fs.s3a.S3AInstrumentation
  • --packages com.amazonaws:aws-java-sdk:1.8.12,org.apache.hadoop:hadoop-aws:2.8.3 , 我也收到 java.lang.IllegalAccessError: tried to access method org.apache.hadoop.metrics2.lib.MutableCounterLong.<init>(Lorg/apache/hadoop/metrics2/MetricsInfo;J)V from class org.apache.hadoop.fs.s3a.S3AInstrumentation
  • --packages com.amazonaws:aws-java-sdk:1.11.275,org.apache.hadoop:hadoop-aws:2.9.0 , 我也收到 java.lang.NoClassDefFoundError: org/apache/hadoop/fs/StorageStatistics

  • 而且,为了完整起见,当我不提供 --packages 时参数,我得到 java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found .

    目前似乎没有任何效果。然而,关于这个主题的 Q/A 太多了,谁知道这样做的方式是什么。这一切都在本地模式下,因此几乎没有其他错误来源。我访问 S3 的方法一定是错误的。它是如何正确完成的?

    编辑1:

    所以我又花了一天时间,没有任何实际进展。据我所知,从 Hadoop 2.6 开始,Hadoop 不再内置对 S3 的支持,而是通过其他库加载它,这些库不是 Hadoop 的一部分,完全由自己管理。除了所有的杂乱之外,我最终想要的图书馆似乎是 hadoop-aws .它有一个网页 here它带有我称之为权威信息的信息:

    The versions of hadoop-common and hadoop-aws must be identical.



    关于此信息的重要一点是, hadoop-common实际上确实附带了 Hadoop 安装。每个 Hadoop 安装都有一个相应的 jar 文件,因此这是一个可靠的起点。我的容器有一个文件 /usr/hadoop-2.7.3/share/hadoop/common/hadoop-common-2.7.3.jar所以可以假设 2.7.3 是我需要的版本 hadoop-aws .

    在那之后它变得模糊。 Hadoop 版本 2.7.x 在内部发生了一些事情,因此它们与 aws-java-sdk 的更新版本不兼容。 ,这是 hadoop-aws 所需的库.网上充斥着使用1.7.4版本的建议, for example here ,但是 other comments建议对 2.7.x 使用 1.7.14 版。

    所以我使用 hadoop-aws:2.7.3 再次运行和 aws-java-sdk:1.7.x , 与 x范围从 4 到 14。没有任何结果,我总是以错误 400,错误请求结束。

    我的 Hadoop 安装发货 joda-time 2.9.4.我读到问题已通过 Hadoop 2.8 解决。我想我会继续使用更新的版本构建我自己的 docker 容器。

    编辑 2

    移至 Hadoop 2.8.3。它现在才有效。事实证明,您甚至根本不必处理 JAR。 Hadoop 附带了用于访问 AWS S3 的工作 JAR。它们隐藏在 ${HADOOP_HOME}/share/hadoop/tools/lib默认情况下不会添加到类路径中。我只是将 JARS 加载到该目录中,如上所述执行我的代码,现在它可以工作了。

    最佳答案

    正如您所发现的那样,将 AWS 开发工具包 JAR 与其他任何东西混合和匹配是徒劳的。您需要构建 Hadoop 时使用的 AWS JAR 版本,以及构建 Jackson AWS 时使用的版本。哦,不要尝试混合任何(不同的 amazon-* JAR、不同的 hadoop-* JAR、不同的 jackson-* JAR);他们都进入锁同步。

    对于 Spark 2.2.0 和 Hadoop 2.7,请使用 AWS 1.7.4 工件,并确保如果您使用的是 Java 8,则 Joda 时间 > 2.8.0,例如 2.9.4。这可能会导致 400 个“错误的身份验证问题”。

    否则,尝试 Troubleshooting S3A

    关于apache-spark - 无法使用 Spark 2.2 访问 S3 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48750464/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com