RDD 中的检查点机制的理解
概念理解
检查点机制目的: 数据的持久化 + 安全性(HDFS)
检查点机制适用场合:
- DGA 中的 Lineage过长
- 在宽依赖上设置 检查点 更好
检查点:
将 RDD 的数据进行持久化到文件系统(HDFS)中
分析
问题:checkPoint 执行跟 cache 一样么?
代码如下:(这里的 HDFS 路径注意自己本地 hosts 文件要有映射关系)
@Test
def checkPointDemo(): Unit = {
sc.setCheckpointDir("hdfs://master:9000/cache")
val oldRDD = sc.makeRDD(1 to 2)
val newRDD = oldRDD
.map(_.toString + "[" + System.currentTimeMillis() + "]")
newRDD.checkpoint()
newRDD.foreach(println)
newRDD.foreach(println)
newRDD.foreach(println)
}
结果:
1[1588064924441]
2[1588064924442]
1[1588064924730]
2[1588064924730]
2[1588064924730]
1[1588064924730]
分析:
发现前两次输出结果不一致,从cache理解角度,三次输出应该都是相同的。因此可以发现, checkPoint 执行方式跟 cache 是不同的
checkPoint 写入流程:
- 在遇到 Action 算子的时候,开始对数据进行处理,当数据结束后,才从后往前一次检查每一个 RDD ,看看需不需要进行 checkPoint ,如果需要,则执行下一步
- 在从头开始一次执行算子,知道设置了 checkPoint 的 RDD ,然后将数据保存在 HDFS 上(本质上是重新启动一个线程,进行写执行算子流程并存数据到HDFS上)
- 清楚 checkPoint 的 RDD 中所有依赖(断开父依赖)
小技巧:
一般在 checkPoint 之前都要进行 cache 或者 persist 。仔细想想哦
因为是创建新的线程,从头开始执行算子,当我们启用 cache 的时候,直接从 cache 中读取数据进行写入即可