Flink和kafka是如何实现端到端的exactly-once的呢?
①首先Flink的内部一定是exactly-once的.因为他利用了CheckPoint机制,把状态存盘,发生故障的时候可以从HDFS文件系统中恢复.
②如果你的Source是kafka的话.可不可以做到呢?
可以的.因为kafka的source是可以做到偏移量(offset)重置的.而且可以随意重置.甚至Flink他会自动帮我重置的.就是在故障恢复的时候他会自动帮我重置的.所以代码我都可以不用写.
③那Sink,kafka支持什么呢?
kafka支持两阶段提交.实际上说白了就是真正意义上的事务.
这个一个前提条件,就是你必须在kafka的配置文件中设置隔离级别和开启我们kafka的事务.这是kafka的配置,是需要我们自己去配的.他和我们Flink的代码是没有关系的.
而且我们kafka 的producer的sink本身就继承了这个TwoPhaseCommitSinkFunction(两阶段提交函数). 上面我们说过有两个父类.一个支持预写日志(WAL)的父类GenriceWriteAheadSink模板类,这个模板类就是父类.还有一个是两阶段提价(2PC)的父类TwoPhaseCommitSinkFunction接口.实际上我们kafka的Producer默认就是支持的.如下图所示:
所以这个对象FlinkKafkaProducer011默认就支持两阶段提交.你只需要把kafka的属性设置好.他就能做到两阶段提交了.所以实际上Flink天生就和kafka结合的.
我们知道,端到端的状态一致性的实现,需要每一个组件都实现,对于Flink + Kafka的数据管道系统(Kafka进、Kafka出)而言,各组件怎样保证exactly-once语义呢?
- 内部 —— 利用checkpoint机制,把状态存盘,发生故障的时候可以恢复,保证内部的状态一致性
- source —— kafka consumer作为source,可以将偏移量保存下来,如果后续任务出现了故障,恢复的时候可以由连接器重置偏移量,重新消费数据,保证一致性
- sink —— kafka producer作为sink,采用两阶段提交 sink,需要实现一个 TwoPhaseCommitSinkFunction
内部的checkpoint机制我们已经有了了解,那source和sink具体又是怎样运行的呢?接下来我们逐步做一个分析。
我们知道Flink由JobManager协调各个TaskManager进行checkpoint存储,checkpoint保存在 StateBackend中,默认StateBackend是内存级的,也可以改为文件级的进行持久化保存。
当 checkpoint 启动时,JobManager 会将检查点分界线(barrier)注入数据流;barrier会在算子间传递下去。
每个算子会对当前的状态做个快照,保存到状态后端。对于source任务而言,就会把当前的offset作为状态保存起来。下次从checkpoint恢复时,source任务可以重新提交偏移量,从上次保存的位置开始重新消费数据。
每个内部的 transform 任务遇到 barrier 时,都会把状态存到 checkpoint 里。
sink 任务首先把数据写入外部 kafka,这些数据都属于预提交的事务(还不能被消费);当遇到 barrier 时,把状态保存到状态后端,并开启新的预提交事务。
当所有算子任务的快照完成,也就是这次的 checkpoint 完成时,JobManager 会向所有任务发通知,确认这次 checkpoint 完成。
当sink 任务收到确认通知,就会正式提交之前的事务,kafka 中未确认的数据就改为“已确认”,数据就真正可以被消费了。
所以我们看到,执行过程实际上是一个两段式提交,每个算子执行完成,会进行“预提交”,直到执行完sink操作,会发起“确认提交”,如果执行失败,预提交会放弃掉。
具体的两阶段提交步骤总结如下:
所以我们也可以看到,如果宕机需要通过StateBackend进行恢复,只能恢复所有确认提交的操作。
选择一个状态后端(state backend)
注意:RocksDB的支持并不直接包含在flink中,需要引入依赖:
1 | <dependency> |
设置状态后端为FsStateBackend:
1 | val env = StreamExecutionEnvironment.getExecutionEnvironment |
探讨:
- 本文作者: xubatian
- 本文链接: http://xubatian.cn/Flink-原理与实现-Flink-Kafka如何实现端到端的exactly-once语义/
- 版权声明: 本博客所有文章除特别声明外均为原创,采用 CC BY 4.0 CN协议 许可协议。转载请注明出处:https://www.xubatian.cn/