从技术上讲,s3n、s3a 和 s3 之间有啥区别?

Posted

技术标签:

【中文标题】从技术上讲,s3n、s3a 和 s3 之间有啥区别?【英文标题】:Technically what is the difference between s3n, s3a and s3?从技术上讲,s3n、s3a 和 s3 之间有什么区别? 【发布时间】:2016-01-26 03:50:17 【问题描述】:

我知道https://wiki.apache.org/hadoop/AmazonS3 的存在以及以下字样:

S3 本地文件系统(URI 方案:s3n)用于在 S3 上读取和写入常规文件的本地文件系统。此文件系统的优点是您可以访问 S3 上使用其他工具编写的文件。相反,其他工具可以访问使用 Hadoop 编写的文件。缺点是 S3 对文件大小施加了 5GB 的限制。

S3A(URI 方案:s3a)S3 Native 的继承者,s3n fs,S3a:系统使用 Amazon 的库与 S3 交互。这允许 S3a 支持更大的文件(不再有 5GB 限制)、更高性能的操作等等。该文件系统旨在成为 S3 Native 的替代品/继任者:从 s3n:// URL 访问的所有对象也应该可以通过简单地替换 URL 架构从 s3a 访问。

S3 块文件系统(URI 方案:s3)由 S3 支持的基于块的文件系统。文件存储为块,就像它们在 HDFS 中一样。这允许有效地实现重命名。此文件系统要求您为文件系统专用一个存储桶 - 您不应使用包含文件的现有存储桶,或将其他文件写入同一存储桶。此文件系统存储的文件可以大于 5GB,但不能与其他 S3 工具互操作。

为什么 URI 上的字母更改会产生如此大的影响?例如

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

根据Work with Storage and File Systems,使用 EMRFS 时:

以前,Amazon EMR 使用 s3n 和 s3a 文件系统。虽然两者仍然有效,但我们建议您使用 s3 URI 方案以获得最佳性能、安全性和可靠性。

其他对 s3n 和 s3a 的历史参考可以在亚马逊的this article 找到(仅在 Wayback 机器上可用)。

【讨论】:

来自 Amazon 的支持文章似乎仍然是最新的,但我现在可以使用 s3a 方案从 EMR 作业写入 S3。答案可能需要修改。 @mig 虽然 s3a 可能有效,而且根据我的经验,它似乎确实有效,但它在技术上不受 AWS 支持。所以,我认为你会自担风险使用它。 @christang 看起来它不再可用所以提供了回程机器链接。 基本上,AWS 支持建议任何支持票使用 s3:// 代替 s3a:// 此 AWS 文档 – docs.aws.amazon.com/emr/latest/ManagementGuide/… – 还建议所有应用程序使用“s3://”:“以前,Amazon EMR 使用 s3n 和 s3a 文件系统。虽然两者仍然有效,但我们建议您使用 s3 URI 方案以获得最佳性能、安全性和可靠性。”可能值得将此添加到您的答案中【参考方案2】:

在 Apache Hadoop 中,“s3://”指的是原始的 S3 客户端,它使用非标准结构来实现可扩展性。该库已弃用,很快将被删除,

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

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

在 Apache Hadoop 中,S3N 和 S3A 都是 S3 的连接器,而 S3A 是使用 Amazon 自己的 AWS 开发工具包构建的继任者。 为什么是新名字?所以我们可以把它和稳定的一起装运。 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 就是你所得到的。它现在比它的前身要好得多,并且性能至少不亚于亚马逊的实施。 Amazon 的“s3:”仍然由他们的闭源客户端 EMR 提供。更多信息请咨询EMR docs。

【讨论】:

【参考方案3】:

TL;DR

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

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

【讨论】:

alexandr,你的数据在哪里来支持你关于 s3 的声明,特别是你说的是哪个版本?如果您使用 hadoop 2.7 jar 体验这一切,这些批评在当时是有效的,但时间是 2016 年

以上是关于从技术上讲,s3n、s3a 和 s3 之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:AWS s3n 正在工作,但 s3a 没有

pyWriteDynamicFrame:无法识别的方案空;预期 s3、s3n 或 s3a [胶水到 Redshift]

从 pyspark 访问 S3 存储桶中的文件

尝试使用 pyspark 从 S3 获取数据时出现空指针异常

Spark 使用 sc.textFile ("s3n://...) 从 S3 读取文件

从技术上讲,Oracle JDK 和 OpenJDK 之间的主要区别是啥? [复制]