避免spark每次都重算RDD以及它的所有依赖,cache()、persist()、 checkpoint()。
1、cache():会被重复使用,但是不能太大的RDD,将其cache()到内存当中,catch()属于 memory only 。cache 是每计算出一个要 cache 的 partition 就直接将其 cache 到内存中。缓存完之后,可以在任务监控界面storage里面看到缓存的数据。
2、persist():可以设置缓存级别,如只在内存,只在磁盘,内存磁盘都用。
MEMORY_ONLY
MEMORY_AND_DISK
MEMORY_ONLY_SER
MEMORY_AND_DISK_SER
DISK_ONLY
MEMORY_ONLY_2, MEMORY_AND_DISK_2, 等等
持久化级别详解:http://bcxw.net/article/425.html
3、checkpoint():computing chain 计算链过长或依赖其他 RDD 很多的 RDD,就需要进行checkpoint,将其放入到磁盘当中。
checkpoint 需要等到job完成了,在启动专门的job去完成checkpoint 操作,因此RDD是被计算了两次的。一般使用的时候配合rdd.cache(),这样第二次就不用重新计算RDD了,直接读取 cache 写磁盘。
rdd.persist(StorageLevel.DISK_ONLY) 与 checkpoint 也有区别,persist一旦程序执行结束,所有的缓存无论在内存还是磁盘都会被删掉。而而 checkpoint 将 RDD 持久化到 HDFS 或本地文件夹,如果不被手动 remove 掉,是一直存在的,也就是说可以被下一个 driver,program 使用,而 cached RDD 不能被其他 dirver program 使用。
cache 跟 persist 不会截断血缘关系,checkPoint 会截断血缘关系。
补充:缓存太多的时候,spark会自动使用 LRU 缓存策略(最近最少使用缓存策略),将最老的分区从内存中移除。若下次使用被移除的分区时,只能重算。