Spark Streaming容错性

        在一个Spark Streaming应用开始时,相关的StreamingContext使用SparkContext启动接收器Reciver成为长驻运行任务。这些接收器接收并保存流数据到Spark内存中以供处理。如上图:

  1. 接收数据:BlockIntervalTimer会每隔一段时间(默认200ms)将收集到的数据打包成一个block,存储到Executor的内存或者磁盘中。如果启动了预写日志,数据同时还被写入到容错文件系统的预写日志文件中;
  2. 通知StreamingContext:数据打包成block后,将元数据发送给Driver的StreamingContext。这个元数据包括:定位在Executor内存或磁盘的块编号,块数据在日志中的偏移信息;
  3. 处理数据:根据块信息产生RDD,根据他们的依赖关系产生Job,再将job分发到对应的Executor来执行;
  4. 周期性设置checkpoint:在上一步里面有一个流计算过程,在计算出结果时,会对其执行checkpoint记录,保存在同一个容错系统中另外一组文件中。

Spark Streaming容错性

        当一个失败的Driver端重启时,会进行上图的数据恢复:

  1. 恢复计算结果:使用checkpoint重启Driver端,重新构造StreamingContext,并重启Receiver;
  2. 恢复元数据块:全部元数据都会被恢复;
  3. 重新生成未完成的Job:使用上一步恢复的元数据,再次生成RDD,以及Job;
  4. 读取数据块:从容错系统的预写日志里面恢复数据块,以便执行Job;
  5. 重发尚未确认的数据:失败时,还没有保存到日志中数据将会由数据源再次发送。

        在启用预写日志(WAL)之后,由于数据的保存是通过落地到磁盘的方式,所以数据接收的吞吐量会稍微有所下降。

相关文章: