Flink+Kafka 实现端到端严格一次
我们知道,端到端的状态一致性的实现,需要每一个组件都实现,对于Flink + Kafka的数据管道系统(Kafka进、Kafka出)而言,各组件怎样保证exactly-once语义呢?
1.内部—— 利用checkpoint机制,把状态存盘,发生故障的时候可以恢复,保证部的状态一致性
2.source —— kafka consumer作为source,可以将偏移量保存下来,如果后续任务出现了故障,恢复的时候可以由连接器重置偏移量,重新消费数据,保证一致性
3.sink —— kafka producer作为sink,采用两阶段提交 sink,需要实现一个 TwoPhaseCommitSinkFunction
具体的两阶段提交步骤总结如下:
1.jobmanager 触发checkpoint 操作,barrier 从source 开始向下传递,遇到barrier 的算子将状态存入状态后端,并通知jobmanagerr
2.第一条数据来了之后,开启一个 kafka 的事务(transaction),正常写入kafka 分区日志但标记为未提交,这就是“预提交”
3.sink 连接器收到barrier,保存当前状态,存入checkpoint,通知jobmanager,并开启下一阶段的事务,用于提交下个检查点的数据
4.jobmanager 收到所有任务的通知,发出确认信息,表示checkpoint 完成
5.sink 任务收到jobmanager 的确认信息,正式提交这段时间的数据
6.外部kafka关闭事务,提交的数据可以正常消费了

网友评论