检查点机制的实现与持久化的实现有着比较大的区别。检查点并非第一次计算就将计算结果进行存储,而是等到一个作业结束之后再启动专门的一个作业去完成存储的操作。
checkPoint操作的实现在RDD类内,checkPoin方法会实例化一个RDDCheckpointData对象用于存储与checkpoint相关的所有信息,并调用RDDCheckpointData内部的markForCheckpoint方法将当前的RDDCheckpointData对象进行标记,代码如下。
RDDCheckpointData类内部有一枚举类型CheckpointState,用于表示RDD检查点的当前状态,其可能值有:Initialized,MarkForCheckpoint,CheckpointingInProgress,Chcekpointed。4种状态的转换过程如下。
(1)Initialized状态
该状态是实例化RDDCheckpointData后的默认状态,该状态存在的时间极短,在checkPoint操作执行完毕之后便会转为下一个状态。
(2)MarkForCheckpoint状态(www.xing528.com)
用户在Initialized状态时调用RDDCheckpointData的markForCheckpoint方法后,所转换成的状态,用于标记当前的RDD已经建立了检查点。
(3)CheckpointingInProgress状态
每个作业结束后都会对作业的末RDD调用其doCheckpoint方法,该方法会顺着RDD的关系链往前遍历,直到遇见内部RDDCheckpointData对象被标记为MarkForCheckpoint的RDD为止,此时将该RDD的RDDCheckpointData对象标记为CheckpointingInProgress,并启动一个作业来完成数据写入操作。
(4)Chcekpointed状态
新启动作业完成数据写入操作之后,将建立检查点的RDD的所有依赖全部清除,将RDD内部RDDCheckpointData标记为Chcekpointed,将RDD的父RDD重新设置为一个CheckpointRDD对象,父RDD的compute方法会直接从文件系统中读取数据。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。