Flink
实现了数据流模型(Dataflow Model
)中许多技术。如果想对事件时间(event time
)和watermarks
更详细的了解,请参阅下面的文章:
支持事件时间的流处理器需要一种方法来衡量事件时间的进度。例如,一个构建小时窗口的窗口算子(operator
),当事件时间超过一小时末尾时需要告知窗口算子,以便算子可以关闭正在进行的窗口。
事件时间可以独立于处理时间来运行。例如,在一个程序中,算子的当前事件时间可以略微落后于处理时间(考虑到接收事件的延迟),而两者以相同的速度继续运行。另一方面,另一个流式处理程序处理几个星期的事件时间只需几秒钟就可以,通过快速浏览缓存在Kafka Topic
中历史数据。
Flink
中测量事件时间进度的机制是watermarks
。watermarks
会作为数据流的一部分进行流动,并带有一个时间戳t
。Watermark(t)
表示数据流中的事件时间已达到时间t
,意思就是说数据流之后不再有时间戳t‘<= t
的元素(即带时间戳的事件老于或等于watermark
)。
下图显示了具有时间戳(逻辑上)的事件流以及内嵌的watermark
。在这个例子中,事件是有序的(相对于它们的时间戳),这意味着watermark
只是数据流中的周期性标记。
watermark
对于乱序数据流至关重要,如下图所示,事件并未按照时间戳进行排序。通常,watermark
表示在数据流中那个时刻小于时间戳的所有事件都已经到达。一旦watermark
到达算子,算子就可以将其内部的事件时间提到watermark
的那个值。
watermarks
是直接通过数据源函数(source functions)生成的或在数据源函数之后生成的。源函数的每个并行子任务通常独立生成watermarks
。这些watermarks
在指定并行数据源上定义事件时间。
watermarks
贯穿整个流处理程序,他们会在watermark
到达的算子时将事件时间提前(advance)。每当算子提前事件时间时,它都会为下游的后续算子生成一个新的watermarks
(Whenever an operator advances its event time, it generates a new watermark downstream for its successor operators.)。
一些算子消耗多个输入流;例如,union操作,或者算子后面跟着keyBy(...)
函数或者partition(...)函数
。这样的算子的当前事件时间是其输入流的所有事件时间中的最小值。随着输入流更新事件时间,算子也会更新事件。
下图显示了事件和watermarks
流经并行流的的示例,以及跟踪事件时间的算子:
某些元素可能违反watermarks
条件,这意味着即使出现watermarks(t)
,但是还是会出现很多的时间戳t'<= t
的元素。事实上,在现实世界中,某些元素可能被任意地延迟,因此指定一个时间,带有事件时间戳的所有事件在此之前出现是不可能的。此外,即使延迟时间是有限制的,也不希望延迟太多的watermarks
,因为它会在事件时间窗口的评估中导致太多的延迟。
因此,流处理程序中可能会明确的知道会有延迟元素。延迟元素是那些系统事件时钟(由watermark
所示)已经超过了延迟元素的时间戳的那些元素。有关如何处理事件时间窗口中的延迟元素的更多信息,请参阅Allowed Lateness。
请参阅调试Windows和事件时间部分,以便在运行时调试Watermarks。
备注:
Flink版本:1.4
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有