- 水位线的本质 (是用来度量事件时间的)
- 水位线的本质是一个时间戳
- 从事件时间里面提取
- 默认200ms生成一个,截取的时当前批次里面最大的时间戳
- 水位线随着数据流动,是一条特殊的标记
- WaterMark是单调递增的,需要保证任务的时间时钟是在前进
- Flink是如何实现端到端精确一次消费
- 1.4版本之后,在数据提交到外部存储时,如果需要实现精确一次处理,也就是Flink应用从Source端开始到Sink端结束,数据必须经过起始点和结束点,保证所有的记录仅影响内部和外部状态一次。
- Source端 : Flink Source 把Kafka的偏移量保存到状态后端。当集群故障时,可以恢复最近一次的CheckPoint 读取出里面的offset 从对应的偏移量开始读取数据。
- TransForm阶段 : Flink内部支持精确一次的语义,靠的是checkPoint机制,Flink会在Source端广播一个Barrier,这个Barrier会随着数据流到下游,当下游接收到上游分区所有的Barrier时,会进行CheckPoint把此时状态保存到状态后端(Barrier对齐)
- Sink端
- 预写日志,幂等写入,两阶段提交
- 预写日志 是Sink端不支持事务,CheckPoint完成之前 将结果都保存到Sink的状态后端,等这一阶段的CheckPoint完成之后,一次性写入
- 如果外部系统自身就支持事务(比如MySQL、Kafka),可以使用2PC方式,可以提供百分百端到端的Exactly-Once。 <
Flink端到端一致性&水位线
最新推荐文章于 2025-05-29 00:15:00 发布