如果我有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。
现在让我们打破这个:
由于 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 的内存计算能力,并添加更多资源以获得更快的性能。
| 归档时间: |
|
| 查看次数: |
10447 次 |
| 最近记录: |