为什么 spark 从 S3 读取和写入这么快

why spark reads and writes so fast from S3

我了解 spark 在并行和内存中处理大规模数据方面的优势。

但是当 reading/writing 数据 from/to S3 时,它如何不在 read/write 到 S3 方面遇到瓶颈。这是否由 S3 存储服务以某种有效的形式处理? S3是分布式存储吗?请提供一些解释,如果可能的话,请提供有关如何了解更多信息的链接。

AWS 中的唯一瓶颈是:

区域内(例如 Amazon EC2 和 Amazon S3 之间)的吞吐量非常高,不太可能限制您传输数据的能力(除了上述 EC2 网络带宽限制之外)。

Amazon S3 分布在一个区域内多个可用区的许多服务器上。在非常高的速度下,Amazon S3 确实有一些建议 Request Rate and Performance Considerations,但这仅适用于每秒发出超过 300 个 PUT/LIST/DELETE 请求或每秒对特定存储桶发出超过 800 个 GET 请求的情况。

Apache Spark 通常部署在多个节点。每个节点都有基于其实例类型的可用网络带宽。 Spark 的并行性质 意味着它可以to/from Amazon S3 比单个实例更快地传输数据。

Apache Spark 通过 Amazon EMR 上的客户端库或其他地方的 Apache Hadoop 团队与 S3 对话。如果您使用 s3a:// URL,则您使用的是最新的 ASF 客户端。

我们在加快速度方面做了很多工作,请参阅 HADOOP-11694

性能杀手竟然是

  1. 存在处理文件时HEAD请求过多(太 代码中的许多检查)。修复:减少这些

  2. 搜索时关闭和重新打开连接。修复:(a) 惰性查找(仅 在 read() 上进行查找,而不是在 seek() 调用上查找),(b) 向前查找 读取和丢弃数据。高效甚至高达几百 KB (YMMV 等)

  3. 对于二进制ORC/Parquet文件,添加一个特殊的fadvise=random模式, 它不会尝试完整获取源文件,而是读取 在块中。如果我们需要回头或远行,剩下的 丢弃的块和重用的 HTTP 1.1 连接:不需要 中止连接并重新协商一个新连接。

一些细节在上个月的演讲中:Spark and Object Stores,尽管它没有涉及新内容(在 Hadoop 2.8(即将发布)、HDP 2.5(发布)中,可能在 CDH 中一段时间)深入。不过,它会推荐各种性能设置,这些设置今天有效。

还要确保您使用的任何压缩都是可拆分的(LZO、snappy 等),并且您的文件不要太小以至于列出目录和打开它们的开销太大。