Amazon web services 如果EMR中的总群集资源内存小于从AWS S3读取的数据集,Spark如何读取和处理AWS EMR中的数据

Amazon web services 如果EMR中的总群集资源内存小于从AWS S3读取的数据集,Spark如何读取和处理AWS EMR中的数据,amazon-web-services,apache-spark,amazon-s3,pyspark,Amazon Web Services,Apache Spark,Amazon S3,Pyspark,假设我有一个AWS集群,其中有1个主节点实例、5个核心节点实例和任务节点,最多可自动扩展到16个实例。每个主节点/任务/核心节点具有以下配置: Master Node : 16Vcore , 128 GB Memory, 600 SSD GB storage Each Core Node : 4Vcore,16 GB memory,64 GB EBS storage Each Task Node : 4Vcore,16 GB memory,50 GB EBS storage 现在,通过以上配

假设我有一个AWS集群,其中有1个主节点实例、5个核心节点实例和任务节点,最多可自动扩展到16个实例。每个主节点/任务/核心节点具有以下配置:

Master Node : 16Vcore , 128 GB Memory, 600 SSD GB storage
Each Core Node : 4Vcore,16 GB memory,64 GB EBS storage
Each Task Node : 4Vcore,16 GB memory,50 GB EBS storage 
现在,通过以上配置,所有任务节点的累积可用内存都是16*16=256 GB 并且累计EBS可用存储空间50GB*16=800GB。因此,我有两个疑问(因为我试图完全理解它是如何工作的)

  • 如果我有一个配置单元外部表,存储位置为s3,大小为500 GB(大于所有任务节点可用的总内存(RAM)),并且我需要读取所有数据,以便使用spark执行一些分析转换,spark将如何处理这些数据
  • 假设在上面的场景中,spark将溢出的数据溢出到磁盘中(我不确定,但仍在假设中)。但是,如果S3中的数据集超过1 TB,这超过了总存储(800 GB)+内存(256 GB)=1056 GB,会发生什么

  • Spark是为了能够处理超过内存容量的数据而构建的。 以下几点可以帮助您理解:

  • 执行查询时,不太可能同时将所有数据存储在内存中
  • Spark会将数据分割为多个部分。因此,您只需要存储在一个分区中的最小内存量。您可以自己更改的分区数。例如,1TB/1000分区=每个分区1 GB。你有那么多的记忆力
  • 分区中有多少数据还取决于数据和查询的性质
  • 真正的限制可能会导致spark中的
    join
    partition
    操作,因为它们需要将具有相同键的数据放在相同的分区上。如果您有少量的键,或者某个键多次出现,那么在同一分区上可能会有太多的数据

  • 我理解分区的概念,但是当我需要对整个1 TB数据执行聚合函数或连接时,有什么让我感到困惑,其中包括洗牌阶段。我需要在总内存的帮助下将整个1 TB的数据分成不同的组。即使是1000个1GB分区,所有分区都只需要在可用内存中存储和处理,在这里,作为一个整体,我只有256GB的可用内存。那么它将如何处理呢?连接是通过
    key
    -一个或多个具有特定值的列来完成的。此
    键将用于创建分区。同时,内存中只需要1个分区就可以进行连接,因为所有参与连接的数据(使用相同的键)都将位于同一个分区中。现在让我们假设我加入了一个特定的ID,比如说PRODUCT_CATEGORY_ID,比如说我总共有4个这样的ID。因此,每个分区将具有来自两个表的相同ID的数据。再次假设两个表中的ID都有200GB的数据,现在我的问题是,当这个连接发生在特定ID的200GB数据上时,等待处理的其余数据将驻留在哪里?在工作节点EBS存储或S3中?您几乎是正确的。不同的ID仍然可能进入同一个分区,但一般来说,您将有4个包含数据的分区。看看这个主题--它可能会帮助您了解spark中的分区。剩余的数据将溢出到磁盘上(如果您将使用
    persist()
    ),或者将被重新计算-例如,所有数据将被再次读取。查看此处-查看弹性