2015-10-26 336 views
46

我知道的https://wiki.apache.org/hadoop/AmazonS3存在和下面的话:技术上s3n,s3a和s3有什么区别?

S3本地文件系统(URI方案:S3N)读取和写入S3常规文件本地文件系统。这个文件系统的优点是你可以访问使用其他工具编写的S3上的文件。相反,其他工具可以访问使用Hadoop编写的文件。缺点是S3强加的5GB文件大小限制。

S3A(URI方案:S3A)的后继S3母语,S3N FS,在S3a中:系统采用Amazon的库与S3交互。这允许S3a支持更大的文件(不超过5GB限制),更高的性能操作等等。该文件系统旨在为/后继S3本地替代:从S3N访问的所有对象:// URL的链接也应该从S3A存取只更换URL模式。

S3块的文件系统(URI方案:S3)基于块的文件系统通过S3支持。文件存储为块,就像它们在HDFS中一样。这允许有效实现重命名。这个文件系统需要你奉献一个水桶的文件系统 - 你不应该使用现有的桶包含文件,或写其他文件到同一个桶。该文件系统存储的文件可能大于5GB,但不能与其他S3工具互操作。

为什么在URI的一封信变化可能会做出这样的区别?例如

val data = sc.textFile("s3n://bucket-name/key") 

val data = sc.textFile("s3a://bucket-name/key") 

有什么区别技术这种变化背后?有什么好的文章可以阅读吗?

回答

45

URI方案的信中变化产生很大的差别,因为它会导致使用不同的软件接口到S3。有点像http和https之间的区别 - 它只是一个字母的变化,但它触发了行为上的巨大差异。

s3和s3n/s3a之间的区别在于s3是基于块的覆盖层,位于Amazon S3之上,而s3n/s3a不是(它们是基于对象的)。

s3n和s3a的区别在于s3n支持最大5GB的对象,而s3a支持最大5TB的对象并且性能更高(都是因为它使用多部分上传)。 s3a是s3n的继任者。

如果您在这里是因为您想了解您应该在Amazon EMR中使用哪个S3文件系统,请阅读Amazon的this article(网址为:使用s3://因为s3://和s3n://在EMR的情况下功能可互换,而s3a://与EMR不兼容)。

+0

来自Amazon的支持文章似乎仍然是最新的,但我现在可以使用's3a'方案从EMR作业写入S3。应该修改答案是可能的。 – mlg

+0

@mig尽管s3a可能有效,并且它确实在我的经验中有效,但它在技术上并没有得到AWS的支持。所以,我认为你会自己承担风险使用它。 – jarmod

17

在Apache Hadoop中,“s3://”是指原始S3客户端,它使用非标准结构进行可伸缩性测试。该库已被弃用,并且很快被删除,因此s3n是其后继者,它将直接路径名称用于对象,因此您可以使用其他应用程序读取和写入数据。像s3://一样,它使用jets3t.jar与S3交谈。

在亚马逊的EMR服务上,s3://指的是亚马逊自己的S3客户端,这是不同的。 EMR中的s3://中的路径直接指向对象存储中的对象。

在Apache Hadoop中,S3N和S3A都是S3的连接器,S3A是使用Amazon自己的AWS SDK构建的后继者。 为什么新的名字?所以我们可以将它与稳定的并排运输。 S3A是所有正在进行的可扩展性,性能,安全性等方面的工作。 S3N是独立的,所以我们不会破坏它。 S3A在Hadoop 2.6中发布,但在2.7之前仍然稳定下来,主要是出现一些小规模问题。

如果您使用的是Hadoop 2.7或更高版本,请使用s3a。如果您使用的是Hadoop 2.5或更早版本。 s3n,如果你使用的是Hadoop 2.6,这是一个更难的选择。 -I'd尝试S3A和切换回S3N如果有problems-

欲了解更多的历史,看到http://hortonworks.com/blog/history-apache-hadoops-support-amazon-s3/

2017年3月14日更新实际上,分区上的S3a在Hadoop中破2.6 ,因为在listFiles()调用中返回的块大小为0:像Spark &这样的工具将工作划分为一个任务/字节。即使数据生成的核心文件系统操作&很满意,您也无法在Hadoop 2.6中使用S3a进行分析工作。 Hadoop 2.7修复了这个问题。

2018-01-10更新 Hadoop 3.0削减了s3:和s3n的实现:s3a就是你所能得到的。它现在比前一代显着更好,并且性能至少与亚马逊实施一样好。亚马逊的“s3:”仍然由EMR提供,这是他们的闭源客户端。有关更多信息,请参阅EMR docs