RDD持久性

【RDD持久性】通过将数据持久存储在操作中的内存中, 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 and Scala)
它将RDD存储为序列化的Java对象(即, 每个分区一个字节数组)。通常, 这比反序列化的对象更节省空间。
MEMORY_AND_DISK_SER
(Java and Scala)
它类似于MEMORY_ONLY_SER, 但是将内存中不适合的分区溢出到磁盘上, 而不是重新计算它们。
DISK_ONLY 它仅将RDD分区存储在磁盘上。
MEMORY_ONLY_2, MEMORY_AND_DISK_2等。 与上面的级别相同, 但是在两个群集节点上复制每个分区。
OFF_HEAP (experimental) 它类似于MEMORY_ONLY_SER, 但是将数据存储在堆外存储器中。必须启用堆外内存。

    推荐阅读