Spark的checkpoint详解

源码注释

/**

*Mark this RDD for checkpointing. It will be saved to a file inside the checkpoint 
将此RDD标记为检查点。它将保存到检查点内的文件中

*directory set with `SparkContext#setCheckpointDir` and all references to its parent  
使用“SparkContext”setCheckpointDir设置的目录及其对其父目录的所有引用

*RDDs will be removed. This function must be called before any job has been 
RDD将被移除。必须在调用任何作业之前调用此函数

*executed on this RDD. It is strongly recommended that this RDD is persisted in emory, otherwise saving it on a file will require recomputation.  
对于这个RDD执行时,烈建议先在内存缓存,否则将其保存在文件中需要重新计算。

*/

 

  1. Spark 中对于数据的保存除了持久化cache或persist操作之外,还提供了一种检查点的机制,检查点(本质是通过将RDD写入Disk做检查点)是为了辅助通过 Lineage 做容错。
  2. Lineage 过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果之后有节点出现问题而丢失分区,从做检查点的 RDD 开始重做 Lineage,就会减少开销。
  3. 为当前 RDD 设置检查点。该函数将会创建一个二进制的文件,并存储到 checkpoint 目录中,该目录是用 SparkContext.setCheckpointDir()设置的。在 checkpoint 的过程中,该RDD 的所有依赖于父 RDD中 的信息将全部被移除。
  4. 对 RDD 进行 checkpoint 操作并不会马上被执行,必须执行 Action 操作才能触发。

为什么建议在 checkpoint前先持久化?

  executed on this RDD. It is strongly recommended that this RDD is persisted in memory, otherwise saving it on a file will require recomputation   

  官方已经说明,如果不缓存,在真正执行保存操作时,spark还会计算一次(安全起见),如果设置了缓存则不会重复计算。   重复计算不仅浪费性能,如果算子中包含当前时间,显然两次计算结果时间是不一样的。即持久化的时间跟第一次计算时的时间不一样

持久化和checkpoint的区别

  1. 持久化只是将数据保存在 BlockManager 中,而 RDD 的 Lineage 是不变的。但是checkpoint 执行完后,RDD 已经没有之前所谓的依赖 RDD 了,而只有一个强行为其设置的checkpointRDD,RDD 的 Lineage 改变了。
  2. 持久化的数据丢失可能性更大,磁盘、内存都可能会存在数据丢失的情况。但是 checkpoint 的数据通常是存储在如 HDFS 等容错、高可用的文件系统,数据丢失可能性较小。
  3. 注意: 默认情况下,如果某个 RDD 没有持久化,但是设置了checkpoint,会存在问题. 本来这个 job 都执行结束了,但是由于中间 RDD 没有持久化,checkpoint job 想要将 RDD 的数据写入外部文件系统的话,需要全部重新计算一次,再将计算出来的 RDD 数据 checkpoint到外部文件系统。 所以,建议对 checkpoint()的 RDD 使用持久化, 这样 RDD 只需要计算一次就可以了.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值