Apache spark 如果没有';本地磁盘上没有足够的空间吗?

Apache spark 如果没有';本地磁盘上没有足够的空间吗?,apache-spark,dataframe,amazon-s3,hdfs,amazon-emr,Apache Spark,Dataframe,Amazon S3,Hdfs,Amazon Emr,我有一个在EMR上用Spark处理数据的项目 据我所知,人们通常将输入数据存储在某个文件系统(HDFS、S3或本地)上,然后对其进行操作。如果数据非常大,我们不希望将其存储在本地 我的问题是,如果我生成了一堆数据,你甚至如何将这些数据远程存储在S3或任何一个云文件系统上?在将数据存储到云上之前,我不需要将数据存储在本地吗 我这样问是因为目前,我正在使用一个服务,它有一个方法可以向我返回SparkDataset对象。我不太清楚工作流是如何在调用该方法和通过Spark on EMR处理该方法之间进行

我有一个在EMR上用Spark处理数据的项目

据我所知,人们通常将输入数据存储在某个文件系统(HDFS、S3或本地)上,然后对其进行操作。如果数据非常大,我们不希望将其存储在本地

我的问题是,如果我生成了一堆数据,你甚至如何将这些数据远程存储在S3或任何一个云文件系统上?在将数据存储到云上之前,我不需要将数据存储在本地吗


我这样问是因为目前,我正在使用一个服务,它有一个方法可以向我返回Spark
Dataset
对象。我不太清楚工作流是如何在调用该方法和通过Spark on EMR处理该方法之间进行的。

在处理Spark和任何分布式存储时,请记住,Spark群集中有一定数量的节点

虽然
数据集
转换是从名为
驱动程序
的集群的单个节点进行操作的,但通常的做法是,所有处理过的数据都不会在这样一个集群的单个节点上收集。集群中执行者角色的每个节点在将整个数据的一部分摄取到Spark、处理并存储回某种存储器的过程中运行


使用这种方法,单个节点的限制不会限制集群可以处理的数据量。

对象存储连接器倾向于以块的形式写入数据;对于每个分区,工作通过Hadoop FS API创建一个文件,路径类似于
s3://bucket/dest/\uu temporary/0/task\u 0001/part-0001.csv
,返回一个工作人员写入的输出流

我不知道关于封闭源代码的EMR s3连接器,ASF S3A连接器在那里供您检查

  • 数据被缓冲到
    fs.s3a.blocksize
    的值;默认值=`32M,即32MB
  • 缓冲是到磁盘(默认)、堆(数组)或堆外字节缓冲区
  • 写入数据时,一旦达到缓冲区阈值,就会上载该块(单独的线程);创建了一个新的块缓冲区
  • 当调用流的
    close()
    方法时,所有未完成的数据都被放入S3,然后线程阻塞,直到所有数据都被上传 上传是在一个单独的线程中进行的,因此即使网络速度很慢,您也可以稍微加快生成数据的速度,并将块放在最后。您需要的磁盘/ram的数量与上载数据的所有工作人员的所有未完成块的数量相同。上载的线程池是共享的,大小有限,因此可以调整参数以限制这些值。虽然通常只有在尝试在内存中缓冲时才需要

    当队列填满时,工作线程通过写入S3输出流块

    然后,您需要的本地存储量取决于:

    • 火花辅助线的数量
    • 它们生成数据的速率
    • 必须上载数据的线程数/http连接数
    • 从VM到S3的带宽(最终限制)
    • 任何节流S3都会导致许多客户端写入相同的存储桶位
    这是与S3A连接器;EMR s3将有所不同,但同样,上传带宽将是瓶颈。我认为它也有一些东西可以阻止那些创建的数据超过网络处理能力的工作人员


    无论如何:对于Spark及其下面使用的hadoop代码,所有的源代码都在那里供您探索。不要害怕这样做

    嗯,这很有道理。但是,在存储到S3(然后由驱动程序节点检索)之前,处理的数据是否必须本地存储?通常,Spark将数据以序列化形式存储在执行器的内存中。如果用户请求,也可以在每个节点的磁盘存储上缓存数据。