CheckPoint原理:
1.对于一个复杂的RDD chain,如果中间某些关键的,在后面会多次使用的RDD因节点故障导致持久化数据丢失,可以针对该RDD启动checkpoint机制,实现容错和高可用。
2.checkpoint,先调用SparkContext的setCheckpointDir()方法,设置一个容错的文件系统目录。
3.对RDD调用checkpoint()方法后,在RDD所处的job运行结束后,会启动一个单独的job,将checkpoint过的RDD数据写入之前设置的文件系统目录,进行高可用、容错的类持久化操作。
4.在后面使用RDD时,即使持久化的数据不小心丢失了,还是可以从它的checkpoint文件中直接读取出来,而不需要重新计算。(CacheManager来实现这个操作)
5.对RDD调用checkpoint()方法之后,它就接收RDDCheckpointData对象的管理,RDDCheckpointData对象会负责将调用了checkpoint()方法的RDD状态设置为MarkedForCheckpoint。
6.RDD所在job运行结束后,会调用job中最后一个RDD的doCheckpoint()方法,该方法会沿着finalRDD的lineage向上查找,将标记MarkedForCheckpoint的RDD标记为CheckpointingInProgress。
7.启动一个单独的job,将lineage中标记为CheckpointingInProgress的RDD进行checkpoint操作。也就是将其数据写入之前设置的checkpoint文件系统目录中。
8.RDD数据checkpoint后,会改变RDD的lineage,会清除掉RDD所有的依赖RDD,并强行将其父RDD设置为一个CheckpointRDD,并且RDD状态变成Checkpointed。