【Spark】cache,persist,checkpoint机制

checkpoint:切断RDD与父RDD的血缘关系,将当前RDD存储于HDFS等外部系统。优点:1)避免占用过多的存储资源存储长的RDD依赖关系;2)节点失败后,避免宽依赖情况下,重复计算

checkpoint原理:

1)对rdd设置检查点,rdd.checkpoint()

2)将此rdd标记为marked for checkpoint

3)job运行完成后,会调用finalRDD.docheckpoint()方法,顺着rdd血缘关系,回溯扫描。发现有"marked for checkpoint"的rdd,进行二次标记(inProgressCheckpoint),标识正在设置检查点。

4)job运行完成后,内部启动一个新的job,将标记为"inProgressCheckpoint"的rdd数据,写入HDFS或者其他系统。

5)将此rdd的父rdd设置成CheckpointRDD,血缘关系就存储下来了。如果出现节点故障,可以通过readCheckpointOrCompute方法优先从CheckpointRDD中读取HDFS中被checkpoint的数据。

6)由于此rdd会被计算两次,因此在设置checkpoint前,先将此rdd做缓存,即rdd=rdd.cache()

同一个application中便于共享数据,可以使用cache,persist。

缓存使用原则:1)被多次重复使用的RDD;2)RDD数据量不能太大,否则占用的内存或者资源过多

cache:调用persis(MEMORY_ONLY),将RDD数据只存入内存,若内存不能存放的下,重新计算。

persist:可以选择存入内存,硬盘以及是否序列化,副本数量。但是这是临时的缓存。当application结束,driver进程,executor进程也会结束,BlockManager也会停止,其所管理的数据也会被删除。

发布了61 篇原创文章 · 获赞 2 · 访问量 7302

猜你喜欢

转载自blog.csdn.net/hebaojing/article/details/104061524