如果数据为 10 GB 并且 RAM 为 1GB,则会将数据 Spark 加载到内存中

int*_*_dp 2 apache-spark

如果我有5 个节点的集群,每个节点有1GB 内存,现在如果我的数据文件10GB分布在所有 5 个节点中,假设每个节点中有 2GB,现在如果我触发

val rdd = sc.textFile("文件路径")

rdd.收集

Spark 会将数据加载到内存中,以及 Spark 将如何处理这种情况,它会立即拒绝还是会处理它。

小智 9

首先让我们理解你所问的问题@intellect_dp,你有一个由 5 个节点组成的集群(这里的术语“节点”我假设机器通常包括硬盘、RAM、4 核 cpu 等),现在每个节点1 GB内存容量和您有 10 GB 的数据文件,其分布方式为 2GB 数据驻留在每个节点的硬盘中。这里假设您正在使用 HDFS,现在每个节点的块大小为 2GB。

现在让我们打破这个:

  • 每个块大小 = 2GB
  • 每个节点的 RAM 大小 = 1GB

由于 Spark 中的延迟计算,只有当“Action API”被触发时,它才会将您的数据加载到 RAM 中并进一步执行。

这里你是说你正在使用“collect”作为操作 API。现在的问题是 RAM 大小小于您的块大小,如果您使用 Spark 的所有默认配置(1 个块 = 1 个分区)处理它,并考虑到没有其他节点会相加,那么在这种情况下会给你内存不足的异常。

现在的问题是——spark 有什么方法可以在给定的硬件配置下处理这种大数据吗?

答案 - 是的,首先您需要设置默认的最小分区:

val rdd = sc.textFile("文件路径",n)

这里 n 将是我默认的块最小分区,现在因为我们只有 1GB 的 RAM,所以我们需要将其保持在 1GB 以下,所以假设我们采用 n = 4,现在你的块大小是 2GB,最小分区是块是 4 :

每个分区大小 = 2GB/4 = 500mb;

现在spark将首先处理这500mb并将其转换为RDD,当下一个500mb块到来时,第一个rdd将溢出到硬盘(假设您已设置存储级别“MEMORY_AND_DISK_ONLY”)。

通过这种方式,它将使用给定的集群硬件配置处理整个 10 GB 的数据文件。

现在我个人不会推荐针对这种情况的给定硬件配置,因为它肯定会处理数据,但有一些缺点:

  • 首先,它会涉及多个 I/O 操作,使得整个过程非常缓慢。

  • 其次,如果在读取或写入硬盘时出现任何延迟,您的整个工作将被丢弃,您将对这样的硬件配置感到沮丧。除此之外,您永远无法确定是否会触发处理您的数据,并且当数据增加时是否能够给出结果。

因此,尽量减少 I/O 操作,并利用 Spark 的内存计算能力,并添加更多资源以获得更快的性能。