RDD的持久化
RDD 的数据是过程数据,因此需要持久化存储;
RDD之间进行相互迭代的计算,新的RDD的生成代表着旧的RDD的消失;这样的特性可以最大化地利用资源,老旧地RDD可以及时地从内存中清理,从而给后续地计算腾出空间;
如下图所示:
rdd3地第一次使用是在构建rdd4的时候,构建完rdd4之后rdd3就不存在了;而第二次使用rdd3的时候,由于其已经不存在,需要根据RDD的血缘关系,从rdd重新执行,构建出来rdd3,供rdd5使用;
RDD的缓存
可以通过缓存技术,将RDD存储在内存中或者磁盘上,这样就不用重复构建rdd了;
常用的缓存API如下:
一般使用
rdd.persist(StorageLevel.MEMORY_AND_DISK)
,优先缓存在磁盘上;如果是内存比较小的集群,可以只缓存到磁盘上;
手动清理缓存的API:
rdd.unpersist()
缓存的特点:缓存被认为是不安全的,因此保留RDD之间的血缘关系
因为缓存的数据有丢失的风险,内存中的缓存可能由于断电/空间不足被清理;磁盘上的缓存可能由于磁盘损坏丢失等等,所以需要保留血缘关系,从而避免数据丢失;
RDD的缓存是如何保存的?
采取
分散存储
:RDD的每个分区自行将其数据保存在其所在的Executor内存和磁盘上
RDD的CheckPoint
CheckPoint也是保存RDD的一种机制,但只支持磁盘存储;
与缓存相比,CheckPoint被认为是安全的,也不会保存RDD之间的血缘关系;
CheckPoint的存储:
集中收集存储
:CheckPoint集中收集各个分区的数据存储在HDFS上;API:
# 设置存储路径,如果是local模式,可以选用本地文件系统 # 如果是集群模式,一定要设置hdfs路径 sc.setCheckpointDir(path) # 存储 rdd.checkpoint() # 清除 rdd.unpersist()
缓存和CheckPoint的对比
Cache 和 CheckPoint的性能对比:
Cache性能更好, 因为是分散存储, 各个Executor并行执行, 效率高, 可以保存到内存中(占内存),更快
CheckPoint比较慢, 因为是集中存储, 涉及到网络IO, 但是存储到HDFS上更加安全(多副本)
注意:Cache 和 CheckPoint两个API都不是action类型的,如果要想正常工作,后面必须有action类型的算子;