我知道https://wiki.apache.org/hadoop/AmazonS3的存在以及以下词语:
S3 Native FileSystem(URI scheme:s3n)用于在S3上读取和写入常规文件的本机文件系统.此文件系统的优点是您可以访问使用其他工具编写的S3上的文件.相反,其他工具可以访问使用Hadoop编写的文件.缺点是S3强加的文件大小限制为5GB.
S3A(URI方案:s3a)S3 Native的继承者s3n fs,S3a:系统使用亚马逊的库与S3交互.这允许S3a支持更大的文件(不超过5GB限制),更高性能的操作等等.文件系统旨在替代S3 Native的/后继者:只需替换URL模式,也可以从s3a访问从s3n:// URL访问的所有对象.
S3 Block FileSystem(URI scheme:s3)由S3支持的基于块的文件系统.文件存储为块,就像它们在HDFS中一样.这允许有效地实现重命名.此文件系统要求您为文件系统专用存储桶 - 不应使用包含文件的现有存储桶,也不应将其他文件写入同一存储桶.此文件系统存储的文件可能大于5GB,但它们不能与其他S3工具互操作.
为什么URI上的字母更改会产生这样的差异?例如
val data = sc.textFile("s3n://bucket-name/key")
Run Code Online (Sandbox Code Playgroud)
至
val data = sc.textFile("s3a://bucket-name/key")
Run Code Online (Sandbox Code Playgroud)
这种变化背后的技术差异是什么?有什么好文章我可以读到这个吗?
尝试使用spark-shell读取位于S3中的文件:
scala> val myRdd = sc.textFile("s3n://myBucket/myFile1.log")
lyrics: org.apache.spark.rdd.RDD[String] = s3n://myBucket/myFile1.log MappedRDD[55] at textFile at <console>:12
scala> myRdd.count
java.io.IOException: No FileSystem for scheme: s3n
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2607)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2614)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
... etc ...
Run Code Online (Sandbox Code Playgroud)
该IOException异常:没有文件系统的方案:S3N与发生错误:
这个错误的原因是什么?缺少依赖,缺少配置或误用sc.textFile()?
或者可能是因为这个帖子似乎暗示了影响Hadoop 2.60特有的Spark构建的错误.我将尝试Spark for Hadoop 2.40,看看这是否解决了这个问题.