从技术上讲,s3n,s3a和s3有什么区别?

时间:2015-10-26 21:33:21

标签: hadoop amazon-web-services amazon-s3 aws-sdk

我知道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:系统使用Amazon的库与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")

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

这一变化背后的技术差异是什么?有什么好文章我可以读到这个吗?

3 个答案:

答案 0 :(得分:102)

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

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

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

如果您在这里是因为您想了解应该与Amazon EMR一起使用哪个S3文件系统,请从亚马逊阅读this article(仅在返回机器上可用)。网是:使用s3://因为s3://和s3n://在EMR的上下文中在功能上是可互换的,而s3a://与EMR不兼容。

如需其他建议,请阅读Work with Storage and File Systems

答案 1 :(得分:36)

在Apache Hadoop中," s3://"是指原始的S3客户端,它使用非标准结构进行扩展。该库已弃用,很快将被删除,

s3n是它的继承者,它使用直接路径名对象,因此您可以与其他应用程序一起读写数据。像s3://一样,它使用jets3t.jar与S3交谈。

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

在Apache Hadoop中,S3N和S3A都是S3的连接器,S3A是使用亚马逊自己的AWS SDK构建的后继产品。 为什么新名字?所以我们可以将它与稳定的那个并排运送。 S3A是关于可伸缩性,性能,安全性等所有正在进行的工作的地方。 S3N是独处的,所以我们不打破它。 S3A在Hadoop 2.6中出货,但仍然稳定到2.7,主要是出现一些小规模问题。

如果您使用的是Hadoop 2.7或更高版本,请使用s3a。如果您使用的是Hadoop 2.5或更早版本。 s3n,如果你使用的是Hadoop 2.6,那就更难了。 - 如果有问题,我会尝试s3a并切换回s3n -

有关更多历史记录,请参阅http://hortonworks.com/blog/history-apache-hadoops-support-amazon-s3/

2017-03-14更新实际上,Hadoop 2.6中S3a的分区已经中断,因为listFiles()调用中返回的块大小为0:Spark& pig将工作划分为一个任务/字节。您无法在Hadoop 2.6中使用S3a进行分析工作,即使核心文件系统操作&数据生成很快乐。 Hadoop 2.7修复了这个问题。

2018-01-10更新 Hadoop 3.0已经削减了s3:和s3n的实现:s3a就是你得到的。它现在明显优于其前身,并且表现至少与亚马逊实施一样好。亚马逊" s3:"仍由EMR提供,这是他们的闭源客户端。有关详细信息,请参阅EMR docs

答案 2 :(得分:1)

TL;博士

  1. AWS EMR 只需使用 s3://
  2. 非 EMR 集群 - 限制使用 S3。
    • 不要使用 s3s3a 直接从您的代码读取/写入大量数据。
    • 使用 s3-dist-cp 将数据提取到集群 HDFS,然后将其发送回 S3
    • s3a 仅用于读取少量到中等数量的数据
    • s3a 写入不稳定

(在 EMR 和私有硬件集群上部署多个作业时的经验谈)

相关问题