要理解Spark Streaming提供的容错机制,先回忆一下Spark RDD的基础容错语义:
1. RDD是不可变的、确定的、可重新计算的、分布式的数据集,每个RDD都会记住确定好的计算操作的血缘关系,这些操作应用在一个容错的数据集上来创建RDD.
2. 如果因为某个Worker节点的失败,导致RDD的某个parititon数据丢失了,那么那个partition额可以通过对原始的容错数据集应用操作血缘,来重新计算出来。
3.所有的RDD transformation操作都是确定的,最后一个被转换出来的RDD的数据,一定是不会因为Spark的失败而丢失的.
Spark操作的通常是容错文件系统中的数据,比如HDFS,因此,所有通过容错数据生成的RDD也是容错的,然而,对于Spark Streaming来说,这却行不通,因为在大多数情况下,数据都是通过网络接收的(除了使用fileStream数据源)。要让Spark Streaming程序中,所有生成的RDD,都达到与普通的Spark程序RDD,相同的容错性,接收到的数据必须被复制到多个Worker节点的Executor内存中,默认的复制因子是2
基于上述理论,在出现失败的事件时,有俩种数据需要被恢复
1. 数据接收到了,并且已经复制过了,--这种数据在一个worker节点挂掉时,是可以继续存活的,因为在其他Worker节点上,还有它的一份副本
2. 数据接收到了,但是正在缓存中,等待复制的--因为还没有复制该数据,因此恢复它的唯一办法就是重新从数据源获取一份
此外,还有俩种失败是我们需要考虑的
1. Worker节点的失败---任何一个运行了Executor的Worker节点的挂掉,都会导致该节点上所有在内存中的数据都会丢失,如果有Receiver运行在该Worker节点上的Executor中,那么缓存的,带复制的数据,都会丢失
2. Driver节点的失败--如果运行Spark Streaming 应用程序的Driver节点失败了,那么显然SparkContext会丢失,那么该Application的所有Executor的数据都会丢失。