【问题标题】:Can't read from S3 bucket with s3 protocol, s3a only无法使用 s3 协议从 S3 存储桶读取,仅限 s3a
【发布时间】:2020-02-11 13:05:17
【问题描述】:

我已经完成了将在 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
*/

【问题讨论】:

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


    【解决方案1】:

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

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

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

    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/

    【讨论】:

    • 对,问题不在于有什么区别。问题是为什么我可以使用 s3a 但不能使用 s3 协议?似乎 hadoop-aws jar 依赖项应该相同(已尝试使用 2.73、2.92 和 3.2.1 版本)。是因为我在 spark 本地模式下运行,而不是在 EMR / hadoop 集群上运行吗?
    • ASF hadoop-aws JAR 中没有 s3:// 客户端。堆栈跟踪是不可避免的
    猜你喜欢
    • 2018-09-06
    • 2017-11-19
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2021-09-27
    • 2018-10-11
    相关资源
    最近更新 更多