Spark RDD - 分区总是在RAM中吗?

Posted

技术标签:

【中文标题】Spark RDD - 分区总是在RAM中吗?【英文标题】:Spark RDD - is partition(s) always in RAM? 【发布时间】:2017-04-05 14:28:34 【问题描述】:

我们都知道 Spark 在内存中进行计算。我只是对以下内容感到好奇。

    如果我从 HDFS 在我的 pySpark shell 中创建 10 个 RDD,这是否意味着所有这 10 个 RDDs 数据都将驻留在 Spark Workers 内存中?

    如果我不删除RDD,它会永远留在记忆中吗?

    如果我的数据集(文件)大小超过可用 RAM 大小,数据将存储在哪里?

【问题讨论】:

【参考方案1】:

如果我从 HDFS 在我的 pySpark shell 中创建 10 个 RDD,是否意味着所有这些 10 个 RDD 数据将驻留在 Spark 内存中?

是的,所有 10 个 RDD 数据都将分布在 spark worker 机器的 RAM 中。但并不是所有机器都必须每个RDD都有一个分区。当然,只有在延迟评估时对其执行任何操作时,RDD 才会将数据保存在内存中。

如果我不删除RDD,它会永远留在内存中吗?

Spark 自动取消持久化 RDD 或 Dataframe(如果不再使用)。为了知道 RDD 或 Dataframe 是否被缓存,您可以进入 Spark UI --> Storage 表并查看 Memory 详细信息。您可以使用df.unpersist()sqlContext.uncacheTable("sparktable") 从内存中删除df 或表。 link to read more

如果我的数据集大小超过了可用的 RAM 大小,数据将存储到哪里 存储?

如果 RDD 不适合内存,则某些分区将不会被缓存,并且会在每次需要时重新计算。 link to read more

如果我们说RDD已经在RAM中,也就是说它在内存中,那么persist()需要什么? --根据评论

为了回答您的问题,当 RDD 上触发任何操作并且该操作找不到内存时,它可以删除未缓存/未持久化的 RDD。

一般来说,我们坚持需要大量计算或/和洗牌的 RDD(默认情况下 spark 坚持洗牌的 RDD 以避免昂贵的网络 I/O),所以当对持久化 RDD 执行任何操作时,它只会执行该操作,而不是根据沿袭图从头开始重新计算,check RDD persistence levels here。

【讨论】:

看起来更好。您应该提到,不需要随时将所有数据保存在内存中。 @mrsrinivas - “是的,所有 10 个 RDD 数据都将分布在 spark worker 机器的 RAM 中。”(执行操作后) - 如果是这种情况,为什么我们需要将 RDD 标记为使用persist() 或cache() 方法持久化它? 我们持久化/缓存 rdds 以避免在下一阶段再次执行 cpu/memory/io 密集型操作/作业。【参考方案2】:

如果我在 Pyspark shell 中创建 10 个 RDD,是否意味着所有这些 10 个 RDD 数据将驻留在 Spark 内存中吗?

答案:RDD 仅包含“沿袭图”(应用的转换)。所以,RDD 不是数据!!!当我们对 RDD 执行任何操作时,所有的转换都会在操作之前应用。所以如果没有显式缓存(当然有一些优化会隐式缓存),每次执行一个动作时,整个转换和动作都会再次执行!!!

例如 - 如果您从 HDFS 创建一个 RDD,应用一些转换并对转换后的 RDD 执行 2 次操作,HDFS 读取和转换将执行两次!!!

所以,如果你想避免重新计算,你必须持久化 RDD。对于持久化,您可以选择 HEAP、Off-Heap、Disk 上的一种或多种组合。

如果我不删除 RDD,它会永远留在内存中吗?

Answer: 考虑到 RDD 只是“谱系图”,它将遵循宿主语言的相同范围和生命周期规则。但是如果你已经持久化了计算结果,你可以不持久化!!!

如果我的数据集大小超过可用 RAM 大小,数据将存储在哪里?

Answer: 假设您实际上已经将 RDD 持久化/缓存在内存中,它将被存储在内存中。 LRU 用于驱逐数据。 Refer 了解更多关于如何在 spark 中进行内存管理的信息。

【讨论】:

假设只有一个 HDFS 读取、转换和操作要做,如果要计算的数据集是 RAM 的三倍大小,那么 RDD 分区中的数据如何加载到内存中进行 Spark 计算? 工人必须有缓冲区来保存单个分区的数据和处理数据所需的缓冲区,否则工人会崩溃!!!分区策略必须考虑到这一点!!! 感谢 Rakesh 的澄清。因此,缓冲区的大小应该大于至少一个分区大小。是否有任何链接可以为我提供更多信息?再次感谢。

以上是关于Spark RDD - 分区总是在RAM中吗?的主要内容,如果未能解决你的问题,请参考以下文章

spark rdd分区数据支持哪些压缩格式

Spark 分区:创建 RDD 分区但不创建 Hive 分区

spark rdd--分区理解

Spark RDD 分区之间的同步

spark自定义分区器

Spark基础学习笔记18:掌握RDD分区