1、概念
在Flink中,水位线是一种衡量Event Time进展的机制,用来处理实时数据中的乱序问题的,通常是水位线和窗口结合使用来实现。
从设备生成实时流事件,到Flink的source,再到多个oparator处理数据,过程中会受到网络延迟、背压等多种因素影响造成数据乱序。在进行窗口处理时,不可能无限期的等待延迟数据到达,当到达特定watermark时,认为在watermark之前的数据已经全部达到(即使后面还有延迟的数据), 可以触发窗口计算,这个机制就是 Watermark(水位线),具体如下图所示。

2、水位线的计算
watermark本质上是一个时间戳,且是动态变化的,会根据当前最大事件时间产生。watermarks具体计算为:
watermark = 进入 Flink 窗口的最大的事件时间(maxEventTime)— 指定的延迟时间(t)
当watermark时间戳大于等于窗口结束时间时,意味着窗口结束,需要触发窗口计算。

3、水位线生成
3.1 生成的时机
水位线生产的最佳位置是在尽可能靠近数据源的地方,因为水位线生成时会做出一些有关元素顺序相对时间戳的假设。由于数据源读取过程是并行的,一切引起Flink跨行数据流分区进行重新分发的操作(比如:改变并行度,keyby等)都会导致元素时间戳乱序。但是如果是某些初始化的filter、map等不会引起元素重新分发的操作,可以考虑在生成水位线之前使用。
3.2 水位线分

水位线是Flink处理实时数据乱序的关键机制,与窗口结合使用。它是动态时间戳,根据最大事件时间及延迟时间计算。水位线通常在数据源附近生成,避免数据流分区重分布引起的乱序。文章介绍了PeriodicWatermarks(周期性水位线)和PunctuatedWatermarks(定点水位线)两种策略,并强调了设置水位线需平衡数据的延迟和完整性。
最低0.47元/天 解锁文章
2149

被折叠的 条评论
为什么被折叠?



