【问题标题】:How to use s3 with Apache spark 2.2 in the Spark shell如何在 Spark shell 中将 s3 与 Apache spark 2.2 一起使用
【发布时间】:2018-01-27 03:13:53
【问题描述】:

我正在尝试在 Spark shell 中从 Amazon AWS S3 存储桶加载数据。

我查阅了以下资源:

Parsing files from Amazon S3 with Apache Spark

How to access s3a:// files from Apache Spark?

Hortonworks Spark 1.6 and S3

Cloudera

Custom s3 endpoints

我已经下载并解压了Apache Spark 2.2.0。在conf/spark-defaults 我有以下内容(注意我替换了access-keysecret-key):

spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key=access-key 
spark.hadoop.fs.s3a.secret.key=secret-key

我已经从mvnrepository下载了hadoop-aws-2.8.1.jaraws-java-sdk-1.11.179.jar,放在jars/目录下。然后我启动 Spark shell:

bin/spark-shell --jars jars/hadoop-aws-2.8.1.jar,jars/aws-java-sdk-1.11.179.jar

在 shell 中,我尝试从 S3 存储桶加载数据:

val p = spark.read.textFile("s3a://sparkcookbook/person")

这是导致的错误:

java.lang.NoClassDefFoundError: org/apache/hadoop/fs/GlobalStorageStatistics$StorageStatisticsProvider
  at java.lang.Class.forName0(Native Method)
  at java.lang.Class.forName(Class.java:348)
  at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:2134)
  at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2099)
  at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193)
  at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2654)
  at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
  at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
  at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
  at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
  at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
  at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)

当我尝试按如下方式启动 Spark shell 时:

bin/spark-shell --packages org.apache.hadoop:hadoop-aws:2.8.1

然后我得到两个错误:一个是在interperter 启动时,另一个是在我尝试加载数据时。这是第一个:

:: problems summary ::
:::: ERRORS
    unknown resolver null

    unknown resolver null

    unknown resolver null

    unknown resolver null

    unknown resolver null

    unknown resolver null


:: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS

这是第二个:

val p = spark.read.textFile("s3a://sparkcookbook/person")
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
  at org.apache.hadoop.fs.s3a.S3AInstrumentation.streamCounter(S3AInstrumentation.java:195)
  at org.apache.hadoop.fs.s3a.S3AInstrumentation.streamCounter(S3AInstrumentation.java:216)
  at org.apache.hadoop.fs.s3a.S3AInstrumentation.<init>(S3AInstrumentation.java:139)
  at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:174)
  at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669)
  at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
  at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
  at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
  at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
  at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
  at org.apache.spark.sql.execution.datasources.DataSource.hasMetadata(DataSource.scala:301)
  at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:344)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152)
  at org.apache.spark.sql.DataFrameReader.text(DataFrameReader.scala:506)
  at org.apache.spark.sql.DataFrameReader.textFile(DataFrameReader.scala:542)
  at org.apache.spark.sql.DataFrameReader.textFile(DataFrameReader.scala:515)

有人可以建议如何让它工作吗?谢谢。

【问题讨论】:

    标签: scala apache-spark amazon-s3


    【解决方案1】:

    如果您使用的是 Apache Spark 2.2.0,那么您应该使用 hadoop-aws-2.7.3.jaraws-java-sdk-1.7.4.jar

    $ spark-shell --jars jars/hadoop-aws-2.7.3.jar,jars/aws-java-sdk-1.7.4.jar
    

    之后,当您尝试从 shell 中的 S3 存储桶加载数据时,您将能够这样做。

    【讨论】:

    • 谢谢 - 做到了。另外,如果其他人正在尝试这种方法,在启动 spark shell 之前,我必须设置两个环境变量,如下所示:export AWS_ACCESS_KEY_ID="access-key"export AWS_SECRET_ACCESS_KEY="secret-key"
    • 感谢您的信息。请告诉我您是如何找到与 spark 2.2 兼容的 hadoop-awsaws-java-sdk 版本的?
    • 很简单!默认情况下,Spark 2.2 是为 Hadoop 2.7.x 预构建的。所以,我们必须使用hadoop-aws v2.7.x。它的编译依赖为aws-java-sdk v1.7.4。如果我们使用 Hadoop 2.8.x 构建 Spark 2.2,那么我们必须使用 hadoop-aws v2.8.x 和 aws-java-sdk v1.10.6。了解更多信息。你可以参考他们的 maven repos。
    • 我也对这些依赖版本感到困惑。我现在正在查看 Spark 2.2.1 Maven 页面,hadoop 版本是 2.6.5? mvnrepository.com/artifact/org.apache.spark/spark-core_2.11/…
    • @himanshuIIITian 已解决。我使用 brew 安装了 Hadoop 2.8(必须修改 2.8.2 的公式,因为我想要 2.8.3,这是最新的 Amazon EMR 使用的)。然后,我从无 Hadoop 的二进制文件(在下载页面上)手动安装了 Spark 2.2.1,并使用这些说明将其指向我的 Hadoop 安装:spark.apache.org/docs/2.1.0/hadoop-provided.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多