Amazon web services 如果EMR中的总群集资源内存小于从AWS S3读取的数据集,Spark如何读取和处理AWS EMR中的数据
假设我有一个AWS集群,其中有1个主节点实例、5个核心节点实例和任务节点,最多可自动扩展到16个实例。每个主节点/任务/核心节点具有以下配置: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 现在,通过以上配
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。因此,我有两个疑问(因为我试图完全理解它是如何工作的)
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()
),或者将被重新计算-例如,所有数据将被再次读取。查看此处-查看弹性