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

akh*_*lly 6 amazon-s3 amazon-web-services apache-spark 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 
Run Code Online (Sandbox Code Playgroud)

现在,通过上述配置,所有任务节点可用的累积内存为16*16=256 GB ,可用的累积 EBS 存储为50GB*16=800GB。所以这是我的两个疑问(因为我试图完全理解它是如何工作的)

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

Vla*_*ans 3

Spark 的构建目的是能够处理超出内存容量的数据。以下几点可以帮助您理解:

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