1、流数据处理的容错语义
1、At most once --最多一次, 也就是说数据最多被处理一次,有可能会丢失 2、At least once --至少一次, 也就是说数据至少会被处理一次,有可能会重复 3、Exactly-Once --精准一次, 也就是说数据只会被处理一次,不会丢也不会重复,注意: 更准确的理解应该是只会被正确处理一次而不是仅一次
2、Flink如何支持End-to-End Exactly-Once
1、Source: offset+Checkpoint: 需要数据源支持offset维护,如Kafka(offset) + Flink(使用Checkpoint维护offset)
FlinkKafkaConsumer<T> extends FlinkKafkaConsumerBase
FlinkKafkaConsumerBase<T> implements CheckpointedFunction
源码中就记录了主题分区和offset信息
ListState<Tuple2<KafkaTopicPartition, Long>> unionOffsetStates
initializeState方法和snapshotState方法
2、Transformation:Checkpoint
flink是有状态的流计算,即所有的状态都会被记录到checkpoint中,如sum、reduce、maxby
3、Sink:两阶段事务提交+Checkpoint
Flink+Kafka, Kafka是支持事务的,所以可以使用两阶段事务提交来实现
FlinkKafkaProducer<IN> extends TwoPhaseCommitSinkFunction
beginTransaction
preCommit
commit
abort
3、两阶段事务提交协议
1、一旦 Flink 开始做 checkpoint 操作,那么就beginTransaction开启事务会进入 pre-commit “预提交”阶段,同时JobManager的Coordinator 会将 Barrier 注入数据流中 2、当所有的 barrier 在算子中成功进行一遍传递(就是Checkpoint完成),并完成快照后,则“预提交”阶段完成; 3、等所有的算子完成“预提交”,就会发起一个commit“提交”动作,但是任何一个“预提交”失败都会导致 Flink 回滚到最近的 checkpoint(abort终止事务);