checkpoint的意思就是建立检查点,类似于快照,例如在spark计算里面 计算流程DAG特别长,服务器需要将整个DAG计算完成得出结果,但是如果在这很长的计算流程中突然中间算出的数据丢失了,spark又会根据RDD的依赖关系从头到尾计算一遍,这样子就很费性能,当然我们可以将中间的计算结果通过cache或者persist放到内存或者磁盘中,但是这样也不能保证数据完全不会丢失,存储的这个内存出问题了或者磁盘坏了,也会导致spark从头再根据RDD计算一遍,所以就有了checkpoint,其中checkpoint的作用就是将DAG中比较重要的中间数据做一个检查点将结果存储到一个高可用的地方(通常这个地方就是HDFS里面)
checkpoint有两种类型的数据:
1. 元数据checkpoint
在类似 HDFS 的容错存储上,保存 Streaming 计算信息。这种检查
点用来恢复运行 Streaming 应用程序失败的 Driver 进程。
2.数据checkpoint
在进行跨越多个批次合并数据的有状态操作时尤其重要。通过周期检查
将转换 RDD 的中间状态进行可靠存储,借以切断无限增加的依赖。使用有状态的转换,如果 updateStateByKey 或者 reduceByKeyAndWindow 在应用程序中使用,那么需要提供检查点路径,对 RDD 进行周期性检查。
问题扩展
checkpoint和持久化的区别:
1.持久化只是将数据保存在BlockManager中,而RDD的lineage是不变的。但是checkpoint执行完后,RDD已经没有之前所谓的依赖RDD了,而只有一个强行为其设置的checkpointRDD,RDD的lineage改变了。
2.持久化的数据丢失可能性更大,磁盘、内存都可能会存在数据丢失的情况。但是checkpoint的数据通常是存储在如HDFS等容错、高可用的文件系统,数据丢失可能性较小。