Checkpointing
一个流处理应用必须能够全天候工作,因此必须能够适应与应用逻辑无关的错误(如:系统错误、JVM崩溃、etc)。为了解决这个问题,Spark Streaming需要将足够的信息检查(checkpoint)到容错存储系统,以便它可以从故障中恢复。检查点有两种类型的数据:
- 元数据检查点(Metadata checkpointing):将流应用的信息保存到容错的存储系统HDFS中,元数据包含:
- Configuration: 流应用的配置信息
- DStream operations:DStream操作算子
- Incomplete batches:未完成的批操作
- 数据检查点(Data checkpointing):将生成的RDD保存到可靠的存储系统中并切断依赖链。
如何开启Checkpointing
- 使用有状态的转换算子:如
updateStateByKey
orreduceByKeyAndWindow
,必须得设置检查点 - 应用的故障恢复:元数据检查点用于使用进度信息进行恢复。
如何配置Checkpointing
-
程序第一次运行
val ssc = new StreamingContext(...) // new context val lines = ssc.socketTextStream(...) // create DStreams ... ssc.checkpoint(checkpointDirectory) // set checkpoint directory
-
失败重新启动
// Get StreamingContext from checkpoint data or create a new one val context = StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext _)
Accumulators, Broadcast Variables, and Checkpoints
首先需要注意的是,累加器(Accumulators)和广播变量(Broadcast variables)是无法从Spark Streaming的检查点中恢复回来的。所以如果你开启了检查点功能,并同时在使用累加器和广播变量,那么你最好是使用懒惰实例化的单例模式,因为这样累加器和广播变量才能在驱动器(driver)故障恢复后重新实例化。