Spark ~ checkpoint 检查点
checkpoint在spark中主要有两块应用:
- 一块是在spark core中对RDD做checkpoint,可以切断做checkpoint RDD的依赖关系,将RDD数据保存到可靠存储(如HDFS)以便数据恢复;
为了能否提高效率,一般情况下,是需要和 cache 联合使用(先使用 cache,再使用checkpoint)
执行过程中,会切断血缘关系。重新建立新的血缘关系
我们的 checkpoint 等同于改变我们的数据源 - 另外一块是应用在spark streaming中,使用checkpoint用来保存DStreamGraph以及相关配置信息,以便在Driver崩溃重启的时候能够接着之前进度继续进行处理(如之前waiting batch的job会在重启后继续处理)。
本文介绍的是在在spark core中对RDD做checkpoint的场景
所谓的检查点其实就是通过将 RDD 中间结果写入磁盘(一般情况下是 HDFS)。
由于血缘依赖过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果检查点之后有节点出现问题, 可以从检查点开始重做血缘,减少了开销。
对 RDD 进行 checkpoint 操作并不会马上被执行,必须执行 Action 操作才能触发。
scala> sc.setCheckpointDir("hdfs://192.168.145.130:8020/love1")
scala>
scala> val rdd1 = sc.parallelize(List(1,2,3,4,5,6,7,8,9)).map(x=>(x,1))
scala>
scala> rdd1.cache()
scala>
scala> rdd1.checkpoint()
scala>
scala> rdd1.foreach(println)
去hadoop查看
checkpoint 数据是以二进制形式保存的
sr scala.Tuple2$mcII$sp6k xQ賣? I _1$mcI$spI _2$mcI$spxr scala.Tuple2.攆}[掶? L _1t Ljava/lang/Object;L _2q ~ xppp sq ~ pp sq ~ pp sq ~ pp sq ~ pp sq ~ pp sq ~ pp sq ~ pp sq ~ pp
几个相关的函数
setCheckpointDir:用于设置checkpoint文件的路径。
scala> sc.setCheckpointDir("hdfs://192.168.145.130:8020/love1")
getCheckpointDir:用于获取设置的checkpoint文件路径
scala> sc.getCheckpointDir
res16: Option[String] = Some(hdfs://192.168.145.130:8020/love1/f88f7d5f-e64e-4bd8-8266-776adc7f1181)
getCheckpointFile:获取checkpoint文件的路径。如果没有做过checkpoint,则为空。
scala> rdd1.getCheckpointFile
res14: Option[String] = Some(hdfs://192.168.145.130:8020/love1/f88f7d5f-e64e-4bd8-8266-776adc7f1181/rdd-1)
isCheckpointed:判断是否做过checkpoint。
scala> rdd1.isCheckpointed
res19: Boolean = true
至于怎么将 checkpoint 的文件重新变为 RDD,这个日后在探讨