Saprk checkpoint、cache、persist的区别
持久化类型 | 特点 |
---|---|
cache | 默认存储级别为:RDD.cache():persist(StorageLevel.MEMORY_ONLY) Dataset.cache():MEMORY_AND_DISK |
persist | 可以自定义存储级别,默认:MEMORY_AND_DISK 可选: DISK_ONLY ,DISK_ONLY_2 , MEMORY_ONLY , MEMORY_ONLY_2 , MEMORY_ONLY_SER ,MEMORY_ONLY_SER_2 ,MEMORY_AND_DISK ,MEMORY_AND_DISK_2 ,MEMORY_AND_DISK_SER ,MEMORY_AND_DISK_SER_2 NONE OFF_HEAP |
checkpoint | 返回此数据集的检查点版本。 检查点可用于截断此数据集的逻辑计划, 这在计划可能指数增长的迭代算法中特别有用。 它将被保存到用 SparkContext#setCheckpointDir 设置的检查点目录内的文件中。与 persist 落盘不同的是,此处落盘在任务失败重启后可以重新使用,在迭代计算非常复杂的情况,适当 checkpoint 时非常有好处的 |
注意:
1.Dataset.cache()
默认MEMORY_AND_DISK
是因为重新计算基础表的内存中列表示是非常昂贵的。
2. 至于persist
基本就是内存、落地磁盘、是否序列化、是否备份的各种组合,
3.MEMORY_AND_DISK*
的落地磁盘是在内存不够的时候才部分落地磁盘,落盘部分会进行序列化
4.DISK_ONLY*
的落地磁盘是直接落盘,不在内存存储,落盘会进行序列化
5.checkpoint
会删除对此Dataset父Dataset
的引用,依赖链会断掉,起到切断血缘的效果
因为此时数据已经持久化到硬盘,不需要重新计算
所以在对某个ds进行checkpoint
时,建议先进行一次ds持久化否则在使用checkpoint
时会开启一个计算,浪费资源。
下面是存储级别的表,通过空间,cpu和性能的影响
级别 | 内存使用 | cpu时间 | 内存 | 磁盘 | 序列化 | 重新计算某些分区 |
---|---|---|---|---|---|---|
MEMORY_ONLY |
High | Low | Y | N | N | Y |
MEMORY_ONLY_SER |
Low | High | Y | N | Y | Y |
MEMORY_AND_DISK |
High | Medium | Some | Some | Some | N |
MEMORY_AND_DISK_SER |
Low | High | Some | Some | Y | N |
DISK_ONLY |
Low | High | N | Y | Y | N |
使用cache、persist
的好处
- 减少计算开销:Spark的计算资源是非常宝贵的,所以通过复用计算可以减少计算开销
- 时间效率:重用重复计算节省大量时间。 所以我们可以在相同时间内执行更多任务