Spark操作通常是容错文件系统中的数据,比如HDFS.因此,所有通过容错数据生成的RDD也是容错的,然而,对于Spark Streaming来说,这却是行不通的,因为在大多数情况下,数据都是通过网络接收的,要让Spark Streaming程序中,所有生成的RDd,都达到与普通Spark程序的RDD相同的容错性,接收到的数据必须被复制到多个Worker节点的Executor内存中,默认复制因子是2
接收数据的容错语义
1. 基于文件的数据源
如果所有的输入数据都在一个容错的文件系统中,比如HDFS,Spark Streaming一定可以从失败进行恢复,并且处理所有的数据。这就提供了一次且仅一次的语义,意味着所有的数据只能处理一次
2. 基于Receiver的数据源
可靠的Receiver:这种Receiver会在接收到了数据,并且将数据复制后,对数据源执行确认操作,如果Receiver在数据接收和复制完成前就失败了,那么数据源对于缓存的数据会接收不到确认,此时,当Receiver重启后,数据源会重新发送数据,没有数据丢失。
不可靠的Receiver,这种Receiver不会发送确认操作,因此当Worker或者Driver节点失败的时候,可能会导致数据丢失。
3. 基于Kafka Direct API,可以保证,所有从Kafka接收到的数据
输出容错
使用事务更新:所有的操作都应该做成事务的,从而让写入操作执行一次且仅一次,给每个batch的数据赋予唯一的标识,然后更新的时候判定,如果数据库中还没有该唯一标识,那么就更新,如果有唯一标识,那么就不更新