检查点(Checkpoint)

1. 目的

本章将讨论什么是检查点,检查点如何帮助Spark实现容错。

2. 检查点(Checkpoint)介绍

一个流应用程序必须全天候运行,所以必须能够解决与应用程序逻辑无关的故障(如:系统错误、JVM崩溃等)。为了使这成为可能,Spark Streaming使用检查点来使系统从故障中恢复。检查点是一个截断RDD Lineage的过程,它将应用程序状态及时保存到可靠存储(如:HDFS)中。

3. 何时使用检查点

应用程序在下面两种情况下必须开启检查点

1)使用有状态的Transformation。如果在应用程序中用到了updateStateByKey或者reduceByKeyAndWindow,检查点目录必需提供。

2)从运行应用程序的Driver的故障中恢复过来。使用检查点恢复处理信息。

注意:没有前述的有状态的Transformation的简单流应用程序在运行时可以不开启检查点。在这种情况下,从Driver故障的恢复将是部分恢复(接收到了但是还没有处理的数据将会丢失)。这通常是可以接受的,许多运行的Spark Streaming应用程序都是这种方式。

4. Checkpointing 和Persist的区别

4.1 Persist

1)当我们使用DISK_ONLY存储级别Persist RDD时,RDD将被存储在磁盘中,该RDD的后续使用将不用重新计算到达该RDD的Lineage。

2)在调用Persist之后,Spark会记住RDD的Lineage。

3)在作业运行完成后,清除缓存并删除文件。

4.2 Checkpointing

1)检查点将RDD存储在HDFS中,并且删除了创建RDD的Lineage。

2)完成作业运行时,与缓存不同,检查点文件不会被删除。

3)当我们创建检查点时,它会导致重复计算。在完成实际的计算工作之前,操作将首先调用缓存,然后写入检查点目录。

5. 结论

使用检查点可以为流数据提供容错功能。当读取操作完成时,不会像Persist那样删除文件。因此,如果计算需要很长时间或者计算链太长或者依赖于太多的RDD,则需要创建检查点。

检查点(Checkpoint)
滚动到顶部