无法从仅使用s3a的s3协议的S3存储桶中读取

时间:2019-10-14 22:14:10

标签: scala apache-spark amazon-s3 amazon-emr

我已经遍历了所有依赖项上的所有线程,以将在AWS EMR上运行的spark连接到s3存储桶,但是我的问题似乎稍有不同。在我所看到的所有其他讨论中,s3和s3a协议具有相同的依赖性。不知道为什么一个为我工作,而另一个却没有。当前,在本地模式下运行spark,s3a可以很好地完成工作,但是我的理解是s3是在EMR上受支持的(由于它依赖于HDFS块存储)。我想让s3协议有效吗?

spark.read.format("csv").load("s3a://mybucket/testfile.csv").show()
//this works, displays the df

spark.read.format("csv").load("s3://mybucket/testfile.csv").show()
/*
java.io.IOException: No FileSystem for scheme: s3
  at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2660)
  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)
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary$1.apply(DataSource.scala:547)
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary$1.apply(DataSource.scala:545)
  at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
  at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
  at scala.collection.immutable.List.foreach(List.scala:392)
  at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
  at scala.collection.immutable.List.flatMap(List.scala:355)
  at org.apache.spark.sql.execution.datasources.DataSource.org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary(DataSource.scala:545)
  at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:359)
  at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
  ... 51 elided
*/

1 个答案:

答案 0 :(得分:1)

Apache Hadoop提供以下文件系统客户端,用于读取和写入Amazon S3:

  1. S3(URI方案:s3)-由S3支持的基于块的文件系统的Ap​​ache Hadoop实现。

  2. S3A(URI方案:s3a)-S3A使用亚马逊的库与S3进行交互。 S3A支持访问大于5 GB且最大5TB的文件,并提供性能增强和其他改进。

  3. S3N(URI方案:s3n)-用于在S3上读写常规文件的本机文件系统。 s3n支持最大5GB的对象

参考:

Technically what is the difference between s3n, s3a and s3?

https://web.archive.org/web/20170718025436/https://aws.amazon.com/premiumsupport/knowledge-center/emr-file-system-s3/