持久化存储
persist
- 功能:对RDD(包含依赖关系)进行缓存,可以自己指定缓存的级别
- 场景:根据资源情况,将RDD缓存在不同的地方或者缓存多份。一般适用于离线场景
- 语法:
persist(StorageLevel)
- StorageLevel:设置缓存级别
- MEMORY_ONLY:缓存仅在内存
- DISK_ONLY:缓存仅在磁盘
- MEMORY_AND_DISK:优先缓存在内存,如果内存不足,再缓存到磁盘
- StorageLevel:设置缓存级别
举例说明:
rdd.persist(StorageLevel.MEMORY_AND_DISK) # 缓存在内存中,如果内存不足则存入磁盘
rdd.persist(StorageLevel.MEMORY_AND_DISK_2) # 缓存两份
cache
cache和persist本质上都是persist缓存,cache调用的就是persist,但是不能指定缓存级别,persist允许指定缓存级别
persist(StorageLevel.MEMORY_ONLY)
的简写,缓存仅在内存中
unpersist
- 功能:将缓存的RDD进行释放
- 语法:
unpersist
- unpersist(blocking=True):等RDD释放完再继续下一步
- blocking = True:阻塞
- unpersist(blocking=True):等RDD释放完再继续下一步
- 场景:明确RDD已经不再使用,后续还有很多的代码需要执行,将RDD的数据从缓存中释放,避免占用资源
- 注意:如果不释放,这个Spark程序结束,也会释放这个程序中的所有内存
- 规范:构建缓存cache或者persist一定要与释放缓存unpersist成对出现
检查点机制
checkpoint
- 功能:将RDD的数据存储在可靠的存储系统(HDFS)中
- 语法:
# 设置一个检查点目录
sc.setCheckpointDir("存储路径")
# 将RDD的数据持久化存储在HDFS
rs_rdd.checkpoint()
- 注意:在代码中会专门多一个job,用于构建数据
- 场景:高安全性,适合对RDD的数据安全性要求比较高,对性能要求不是特别高的情况下。一般适用于实时场景下
总结
区别 | 持久化 | 检查点 |
---|---|---|
存储位置 | 保存在本地的内存或磁盘 | 保存在可靠的存储系统(HDFS)中 |
生命周期 | 程序结束后会被清除或者调用unpersist方法清除 | 程序结束后依然存在,只能手动清除 |
依赖关系 | 保存的是RDD,会保留RDD的血脉关系 | 保存的是RDD的数据,不包含血脉关系 |