Kafka 与 spark streaming 集成,如何保证 exactly once 语义 Spark Streaming 上游对接 Kafka时保证Exactly Once?
Kafka 42
Spark Streaming 上游对接 kafka 时保证 Exactly Once
Spark Streaming使用Direct模式对接上游kafka。
无论kafka有多少个partition, 使用Direct模式总能保证SS中有相同数量的partition与之相对,也就是说SS中的KafkaRDD的并发数量在Direct模式下是由上游kafka决定的。
在这个模式下,kafka的offset是作为KafkaRDD的一部分存在,会存储在checkpoints中,由于checkpoints只存储 offset 内容,而不存储数据,这就使得checkpoints是相对轻的操作。 这就使得SS在遇到故障时,可以从 checkpoint中恢复上游kafka的offset,从而保证exactly once。
Spark Streaming 输出下游保证 Exactly once
- 第一种“鸵⻦做法”,就是期望下游(数据)具有幂等特性。
多次尝试总是写入相同的数据,例如,saveAs***Files 总是将相同的数据写入生成的文件 - 使用事务更新
所有更新都是事务性的,以便更新完全按原子进行。这样做的一个方法如下: 使用批处理时间(在 foreachRDD中可用)和RDD的partitionIndex(分区索引)来创建identifier(标识符)。 该标识符唯一地 标识streaming application 中的blob数据。 使用该identifier,blob 事务地更新到外部系统中。也就是 说,如果identifier尚未提交,则以 (atomicall)原子方式提交分区数据和identifier。否则,如果已经提 交,请跳过更新。