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的持久化级别,表⽰会将持久化数据复⽤⼀份,保存到其他节点,从⽽在数据丢失时,不需要再次计算,只需要使⽤备份数据即可。