RDD 是保存在内存中还是在一个动作完成后立即刷新出内存?

问题描述

我正在阅读一本书,这本书对我来说陈述了一个矛盾的陈述。引用本书: “认情况下,每次对 Spark 的 RDD 运行操作时都会重新计算它们。” 但在接下来的几行中,它指出: “在第一次计算之后,Spark 会将 RDD 内容存储在内存中,并在以后的操作中重用。”

我的问题是,如果 RDD 存储在内存中,为什么每次对它们调用操作时都要重新计算?

在第一条语句中,它说每次都重新计算 RDD,在第二条语句中它说,RDD 存储在内存中,以便在以后的操作中重用它们。

解决方法

"Spark’s RDDs are by default recomputed each time you run an action on them." 对于您的这个语句,是的,每次对 RDD 运行操作时都会重新计算它们。现在背后的原因是,如果它将所有 RDD 内容存储在内存中,那么您的内存很快就会耗尽。因此,它不能将每个 RDD 都保存在内存中。当您对其执行任何操作时,它会从源数据中读取并对其执行转换,并为您提供操作的输出。

"After computing it the first time,Spark will store the RDD contents in memory and reuse them in future actions." 默认情况下它不会将其存储在内存中,但根据您的用例,您可以使用 df.cache()df.persist() 持久化特定 RDD,然后它将该 RDD 内容存储在内存,当您第二次执行依赖于缓存的 RDD 的 RDD 的任何操作时,它不会从源读取它,但它会从内存中使用它。只有在对 RDD 执行多个操作时才应缓存 RDD,或者存在复杂的转换逻辑,您不希望每次调用操作时 Spark 都执行。