RDD 的持久化操作有 cache()和 persist()两种方法。每一个 RDD 都可以用不同的存储级别进行保存,从而允许持久化数据集在硬盘或内存中作为序列化的Java对象,甚至跨节点复制。存储级别是通过 org.apache.spark.storage.StorageLevel对象确定的,常用存储级别如表 4-5所示。cache()方法是使用默认存储级别的快捷方法,也就是StorageLevel.MEMORY ONLY将反序列化的对象存人内存)。如果需要将数据保存到1个副本中,那么可以通过在存储级引末尾加上“_2”将数据持久化并保存为2份。
RDD的存储级别应该根据需要以及具体情况设置,在 RDD 参与第一次计算后,RDD会根据设置的存储级别保存计算后的值到内存或磁盘中。只有未曾设置存储级别的 RDD才能设置存储级别,已经设置了存储级别的 RDD不能修改存储级别。
针对将数据存储到内存中的存储策略,如果内存不足,那么 Spark将使用最近最少使用(Least Recently Used,LRU)缓存策略清除最老的分区,为新的 RDD 提供存储空间。因此,缓存在内存中的 RDD 分区数据是会被清除的,不能长久保存,而缓存在磁盘上的数据则不会被清除。若内存不够存放 RDD 所有分区数据,则该 RDD 数据可能不会进行持久化,下次对该 RDD 执行转换操作或行动操作时,没有被持久化的 RDD 数据需要重
新计算。如果需要人为清除已经不需要的数据,可以使用 RDD 提供的 unpersist()方法。