RDD 持久化2024 年 8 月 28 日 | 阅读 2 分钟 Spark 提供了一种便捷的方式来处理数据集,即在操作过程中将其持久化在内存中。在持久化 RDD 时,每个节点都会将它计算的任何分区存储在内存中。现在,我们也可以在对该数据集的其他任务中重用它们。 我们可以使用 persist() 或 cache() 方法来标记要持久化的 RDD。Spark 的缓存具有容错性。无论如何,如果 RDD 的分区丢失,它将自动使用最初创建它的转换重新计算。 有多种存储级别可用于存储持久化的 RDD。通过将 StorageLevel 对象(Scala、Java、Python)传递给 persist() 来使用这些级别。但是,cache() 方法用于默认存储级别,即 StorageLevel.MEMORY_ONLY。 以下是一组存储级别 存储级别 | 描述 |
---|
MEMORY_ONLY | 它将 RDD 作为反序列化的 Java 对象存储在 JVM 中。这是默认级别。如果 RDD 不适合内存,则某些分区将不会被缓存,并在每次需要时重新计算。 | MEMORY_AND_DISK | 它将 RDD 作为反序列化的 Java 对象存储在 JVM 中。如果 RDD 不适合内存,则将不适合的分区存储在磁盘上,并在需要时从那里读取它们。 | MEMORY_ONLY_SER (Java 和 Scala) | 它将 RDD 存储为序列化的 Java 对象(即,每个分区一个字节数组)。这通常比反序列化的对象更节省空间。 | MEMORY_AND_DISK_SER (Java 和 Scala) | 它类似于 MEMORY_ONLY_SER,但将不适合内存的分区溢出到磁盘,而不是重新计算它们。 | DISK_ONLY | 它仅将 RDD 分区存储在磁盘上。 | MEMORY_ONLY_2, MEMORY_AND_DISK_2, etc. | 它与上述级别相同,但在两个集群节点上复制每个分区。 | OFF_HEAP (实验性) | 它类似于 MEMORY_ONLY_SER,但将数据存储在堆外内存中。必须启用堆外内存。 |
|