RDD持久化

RDD持久化

Spark通过在操作中将其持久保存在内存中,提供了一种处理数据集的便捷方式。在持久化RDD的同时,每个节点都存储它在内存中计算的任何分区。也可以在该数据集的其他任务中重用它们。

我们可以使用persist()cache()方法来标记要保留的RDD。Spark的缓存是容错的。在任何情况下,如果RDD的分区丢失,它将使用最初创建它的转换自动重新计算。

存在可用于存储持久RDD的不同存储级别。通过将StorageLevel对象(Scala,Java,Python)传递给persist()来使用这些级别。但是,cache()方法用于默认存储级别,即StorageLevel.MEMORY_ONLY

以下是存储级别的集合:

存储级别 描述
MEMORY_ONLY 它将RDD存储为JVM中的反序列化Java对象。这是默认级别。如果RDD不适合内存,则每次需要时都不会缓存和重新计算某些分区。
MEMORY_AND_DISK 它将RDD存储为JVM中的反序列化Java对象。如果RDD不适合内存,请存储不适合磁盘的分区,并在需要时从那里读取它们。
MEMORY_ONLY_SER 它将RDD存储为序列化Java对象(即每个分区一个字节的数组)。这通常比反序列化的对象更节省空间。
MEMORY_AND_DISK_SER 它类似于MEMORY_ONLY_SER,但是将内存中不适合的分区溢出到磁盘而不是重新计算它们。
DISK_ONLY 它仅将RDD分区存储在磁盘上。
MEMORY_ONLY_2, MEMORY_AND_DISK_2 它与上面的级别相同,但复制两个群集节点上的每个分区。
OFF_HEAP 它类似于MEMORY_ONLY_SER,但将数据存储在堆外内存中。必须启用堆外内存。