天天看点

Spark源码分析 – Checkpoint

1. 首先如果rdd需要cp, 调用rdd.checkpoint()来mark 

注释说了, 这个需要在job被执行前被mark, 原因后面看, 并且最好选择persist这个rdd, 否则在存cp文件时需要重新computerdd内容 

并且当rdd被cp后, 所有dependencies都会被清除, 因为既然rdd已经被cp, 那么就可以直接从文件读取, 没有必要保留之前的parents的dependencies(保留只是为了replay)

2. 在sparkcontext.runjob中, 最后会调用rdd.docheckpoint() 

如果前面已经mark过, 那么这里就会将rdd真正cp到文件中去, 这也是前面为什么说, mark必须在run job之前完成

3. 在rddcheckpointdata.docheckpoint中

会调用rdd.markcheckpointed(newrdd), 清除dependencies信息 

并最终将状态设为, checkpointed, 以表示完成cp

4. checkpoint如何使用, 在rdd.computeorreadcheckpoint中, 看到如果已经完成cp, 会直接从firstparent中读数据, 刚开始会觉得比较奇怪

rdd.firstparent的定义如下, 就是从dependencies中取第一个dependency的rdd

而rdd.dependencies的定义如下, 可用看到在完成cp的情况下, 从dependencies中读到的其实就是cp rdd, 所以可以直接用

继续阅读