使用 Spark 是否可以在不接触磁盘的情况下从 s3 读取和写入?

Using Spark Is it possible to read from s3 and write from s3 without touching the disk?

我的大部分脚本都在做类似以下的事情。

spark.read().csv("s3://")
  .filter(..).map(...)
  .write().parquet("s3://");

有什么方法可以指定 spark,我希望所有这些工作都在内存中完成,因为我的处理没有聚合、分组?这应该是记录流处理器的简单记录,根本不接触磁盘。

我不能代表 EMR 及其 s3 连接器。我可以代表 Apache Hadoop 本身和 S3A 连接器

我们需要在上传到 S3 之前缓冲生成的数据。您不能执行 stream() 后接 close(),因为对于大文件,您需要将上传分成 4+GB 的文件,即使对于较小的上传,您也需要处理应用程序生成的常见情况数据速度比您上传到 S3 的速度还快。[=​​10=]

使用临时本地临时存储使您能够以比 S3 上传带宽可以处理的速度更快的速度生成数据,并通过重新发送块来应对网络错误。

A​​pache 的原始 s3: 和 s3n: 客户端(以及 Hadoop 2.8 之前的 s3a)在开始上传之前都将整个文件写入 HDD。您需要的存储空间与生成的 #of 字节相同,并且由于它仅在 close() 中上传,因此关闭调用的时间为 data/bandwidth。

Hadoop 2.8+中的S3A支持快速上传(2.8+可选,3.0自动),其中数据缓冲到单个块的大小(5+MB,默认64MB),一旦上传就开始上传达到块大小。这使得写入速度更快,带宽足够时几乎没有 close() 延迟(最大值:last-block-size/bandwidth)。它仍然需要存储来应对生成速率和上传速率之间的不匹配,尽管您可以将其配置为使用堆字节数组或堆外字节缓冲区。这样做,您必须非常小心地处理内存分配和队列大小:您需要将客户端配置为在等待上传的队列足够大时阻止编写器。

更新 Johnathan Kelly @AWS 已确认他们对每个块缓冲区和上传操作与 ASF S3A 连接器相同。这意味着如果 bytes/sec 中的数据生成速率 <= 从 VM 上传带宽,那么所需的本地磁盘数量是最小的......如果你更快地生成数据,那么你将需要更多(最终 运行 磁盘不足或达到某些队列限制以阻塞生成器线程)。我不会引用实际带宽的任何数字,因为它总是逐年提高,任何声明很快就会过时。出于这个原因,在相信之前先看看任何 post 基准的年龄。使用您自己的工作负载进行您自己的测试。

可以,spark.read().csv("s3://") 适用于 emr spark。

当我尝试直接在 s3 上写入时遇到问题,在集群一致视图中处于活动状态。

http://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-consistent-view.html