如何在Spark shell中使用带有Apache spark 2.2的s3

Sha*_*mal 16 scala amazon-s3 apache-spark

我正在尝试从Spark AWS shell中加载来自Amazon AWS S3存储桶的数据.

我咨询过以下资源:

使用Apache Spark从Amazon S3解析文件

如何从Apache Spark访问s3a://文件?

Hortonworks Spark 1.6和S3

Cloudera的

自定义s3端点

我已经下载并解压缩了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
Run Code Online (Sandbox Code Playgroud)

我已经下载hadoop-aws-2.8.1.jaraws-java-sdk-1.11.179.jarmvnrepository,并将它们放置在jars/目录中.然后我启动Spark shell:

bin/spark-shell --jars jars/hadoop-aws-2.8.1.jar,jars/aws-java-sdk-1.11.179.jar
Run Code Online (Sandbox Code Playgroud)

在shell中,以下是我尝试从S3存储桶加载数据的方法:

val p = spark.read.textFile("s3a://sparkcookbook/person")
Run Code Online (Sandbox Code Playgroud)

以下是导致的错误:

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)
Run Code Online (Sandbox Code Playgroud)

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

bin/spark-shell --packages org.apache.hadoop:hadoop-aws:2.8.1
Run Code Online (Sandbox Code Playgroud)

然后我得到两个错误:一个是间隔器启动时,另一个是我尝试加载数据时.这是第一个:

:: 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
Run Code Online (Sandbox Code Playgroud)

这是第二个:

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)
Run Code Online (Sandbox Code Playgroud)

有人可以建议如何使这个工作?谢谢.

him*_*ian 18

如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢 - 这样做了.此外,如果其他人正在尝试这种方法,在启动spark shell之前,我必须设置两个环境变量,如下所示:`export AWS_ACCESS_KEY_ID ="access-key"`和`export AWS_SECRET_ACCESS_KEY ="secret-key"`. (3认同)
  • 谢谢(你的)信息.你能不能告诉我你是如何找到与spark 2.2兼容的`hadoop-aws`和`aws-java-sdk`的版本的? (3认同)
  • 这很容易!默认情况下,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回购. (3认同)
  • @himanshuIIITian解决了.我使用brew安装了Hadoop 2.8(必须修改2.8.2的公式,因为我想要2.8.3,这是最新的Amazon EMR使用的).然后我从Hadoop-free二进制文件(在下载页面上)手动安装了Spark 2.2.1,并使用这些说明将它指向我的Hadoop安装:https://spark.apache.org/docs/2.1.0/hadoop-provided html的 (2认同)