RDD 持久化原理?
spark 非常重要的一个功能特性就是可以将 RDD 持久化在内存中。
调用 cache()和 persist()方法即可。cache()和 persist()的区别在于,cache()是 persist()的一种简化方式,cache()的底层就是调用 persist()的无参版本 persist(MEMORY_ONLY),将数据持久化到内存中。从内存中清除缓存,可以使用 unpersist()方法。
RDD 持久化是可以手动选择不同的策略的。在调用 persist()时传入对应的 StorageLevel即可。
(1)MEMORY_ONLY:以非序列化的 Java 对象的方式持久化在 JVM 内存中。如果内存无法完全存储 RDD 所有的 partition,那么那些没有持久化的 partition 就会在下一次需要使用它的时候,被重新计算。
(2)MEMORY_AND_DISK:同上,但是当某些 partition 无法存储在内存中时,会持久化到磁盘中。下次需要使用这些 partition 时,需要从磁盘上读取。
(3)MEMORY_ONLY_SER:同 MEMORY_ONLY,但是会使用 Java 序列化方式,将 Java 对象序列化后进行持久化。可以减少内存开销,但是需要进行反序列化,因此会加大 CPU 开销。
(4)MEMORY_AND_DSK_SER:同 MEMORY_AND_DSK,但是使用序列化方式持久化 Java对象。
(5)DISK_ONLY:使用非序列化 Java 对象的方式持久化,完全存储到磁盘上。
(6)MEMORY_ONLY_2/MEMERY_AND_DISK_2:如果是尾部加了 2 的持久化级别,表示会将持久化数据复用一份,保存到其他节点,从而在数据丢失时,不需要再次计算,只需要使用备份数据即可。