两者都是做RDD持久化的。
缓存机制包括cache()和persist():
需要使用cache的场景,会被重复使用并且不能太大的RDD需要cache,cache只使用memory,写磁盘的话那就叫checkpoint了。需要使用checkpoint的场景,运算时间很长或者运算量太大才能得到的RDD。实际上,将shuffleMapTask的输出结果存放到本地磁盘也算是checkpoint,只不过这个checkpoint目的是输出数据到partition。
cache的机制是,每计算出一个要cache的partition就直接将其cache到内存。但checkpoint不一样,它是等到job结束后另外启动专门的job去完成checkpoint,也就是说需要checkpoint的RDD会被计算两次。因此,在使用rdd.checkpoint()的时候,建议加上rdd.cache(),这样第二次运行的job就不用再去计算该rdd了,直接读取cache写磁盘。
persist()与checkpoint()
深入一点讨论,rdd.persist(StorageLevel.DIST_ONLY)与checkpoint的区别。persist虽然可以将RDD的partition持久化到磁盘,但该partition由blockManager管理。一旦driverprogram执行结束,也就是executor所在进程CoarseGrainedExecutorBackend stop,BlockManager也会stop,被cache到磁盘上的RDD也会被清空(整个BlockManager使用的local文件夹被删除)。
而checkpoint将RDD持久化到HDFS或本地文件夹,如果不被手动remove,则会一直存在,也就是说可以被下一个driver program使用,而cached RDD不能被其他driver program使用。
同时,cache和persist不会截断血缘关系,checkpoint会截断血缘关系。
网友评论