spark streaming的容错机制

Worker节点

  1. 从Hdfs中读取数据
    Executor会将自身任务执行的元数据信息汇报给Driver,Driver将其记录到日志中。当一个Executor挂掉后,Driver可以根据该日志重启一个Executor,又因为数据依然存放在Hdfs中。所以容错OK。
  2. 从kafka,flume这种数据源
    它的问题在于Driver重启Executor后,还需要原来的数据。Spark Streaming引入了Write Ahead log机制,对于这种数据,还会写入到有容错机制的文件系统中,如hdfs.

Driver节点

  1. Driver节点在运行时,除了记录executor的元数据的日志,还会周期性的将处理信息checkpoint到hdfs中。这样当一个Driver失败后,可以在另一个节点上从hdfs上下载原来的信息,重建sparkContext等,然后读取元数据日志,重新联系未完成的job。

也可以看看下面这篇文章


当一个Spark Streaming应用启动了(例如driver启动), 相应的StreamingContext使用SparkContet去启动receiver,receiver是一个长时间执行的作业,这些接收器接收并保存这些数据到Spark的executor进程的内存中,这些数据的生命周期如下图所示

spark streaming的容错机制

1:蓝色的箭头表示接收的数据,接收器把数据流打包成块,存储在executor的内存中,如果开启了WAL,将会把数据写入到存在容错文件系统的日志文件中
2:青色的箭头表示提醒driver, 接收到的数据块的元信息发送给driver中的StreamingContext, 这些元数据包括:executor内存中数据块的引用ID和日志文件中数据块的偏移信息
3:红色箭头表示处理数据,每一个批处理间隔,StreamingContext使用块信息用来生成RDD和jobs. SparkContext执行这些job用于处理executor内存中的数据块
4:黄色箭头表示checkpoint这些计算,以便于恢复。流式处理会周期的被checkpoint到文件中

当一个失败的driver重启以后,恢复流程如下
spark streaming的容错机制

1:黄色的箭头用于恢复计算,checkpointed的信息是用于重启driver,重新构造上下文和重启所有的receiver
2: 青色箭头恢复块元数据信息,所有的块信息对已恢复计算很重要
3:重新生成未完成的job(红色箭头),会使用到2恢复的元数据信息
4:读取保存在日志中的块(蓝色箭头),当job重新执行的时候,块数据将会直接从日志中读取,
5:重发没有确认的数据(紫色的箭头)。缓冲的数据没有写到WAL中去将会被重新发送。