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也会停止,其所管理的数据也会被删除。