Spark streaming的Exactly-once容错HA机制

Spark streaming 1.2提供的基于WAL的容错机制(参考上一篇博文http://blog.csdn.net/yangbutao/article/details/44975627),可以保证数据的计算至少被执行一次,

但是不能保证只执行一次,比如在kafka receiver写数据到WAL中后,往zookeeper写offset失败,那么在driver失效恢复后,由于offset还是之前写过的offset位置,数据又会从kafka中拉取一次,就执行一次了,而对于一些场景中对一致的性要求比较严格的,并且1.2的HA机制比较复杂,且对性能的影响比较大。

从1.3开始提供了一种更简单的方式支持了对Spark streaming Exactly-one的需求,这就是Direct API。

参考下图:


区别1.2版本HA依赖于WAL和Receiver,1.3版本的利用Direct API方式实现了Exactly-once。

Driver在生成RDD任务时,对于每个batch的划分,是基于kafka的消费的offset范围的;当每个job在执行时,数据从kafka中基于划分的offset范围获取;当前的offset可以在Driver中通过checkpoint机制进行可靠的存储,以便于失效时可靠的恢复。由于去掉了Receiver,对于并行的操作也不需要配置多少个线程消费kafka的partition,在Direct API的实现中,每个RDD的分区对应于kafka的分区,大大简化的并行编程模型,做到自动并行读取。


你可能感兴趣的:(spark)