持久化
在数据库中,把数据写入表里的过程。
在spark中,把内存中的RDD临时永久存储起来的过程
容错机制
如果数据在内存中丢失,向父级依赖查找数据,直到找到数据为止,最坏的情况是找到hdfs重新获取数据重新计算,自动把结果补到原来持久化的位置。
两种方式会使用持久化操作:
1,数据量大,数据复杂
2,同一个rdd多次提交,即一个rdd复用
用法:
创建持久化:
就是转换算子,直接调用就可以
cache() 完全等价于 persist(),使用默认策略持久化
如果想改变策略,使用persist(策略)指定持久化策略
删除持久化:
a.spark本身根据最近最少使用原则,自动取消持久化
b.手动调用unpersit算子取消持久化
从持久化的rdd中移除当前rdd,
并把它的策略置为None
策略
两组对比
1) MEMORY_ONLY 和 MEMORY_ONLY_SER
带SER的节省一定的空间
2) MEMORY_ONLY 和 MEMORY_AND_DISK
MEMORY_ONLY:先存内存,如果存不下就不存了。
读取的时候没存的部分重新读数据重新计算
MEMORY_AND_DISK:先存内存,如果存不下存磁盘。
读取的时候先读内存,再读磁盘中的数据
即使重新读取数据重新计算,
速度也比多做一次磁盘IO速度要快。
持久化策略的选择
a.没有特殊情况,就使用默认的存储等级
发挥出最大的CPU性能且计算速度尽可能快
b.如果内存不太够用,可以使用SER进行使用
节省一定的内存空间,速度也会很快。
c.如果rdd的计算量非常复杂,可以选用Disk
d.为了快速容错,可以选用带副本的策略
可以避免容错的时候重新计算的时间耗费
checkPoint
检查点
也是一个很普通的算子,直接调用就可以
val sc=new SparkContext(conf)
首先sc.setCheckPointDir()设置检查点路径
对某个RDD设置检查点,把所有父级依赖全部删除
把当前状态存在这个检查点路径下,一般为hdfs。
强烈建议在做检查点之前先做持久化,为了避免重复计算