Flink Watermark Window 的理解

Watermark Window 的一些理解


Watermark

在一定的时间范围内允许迟到的时间

不建议设置等待的时间太长,一般等待 5s ~ 10s

所以 WaterMark 主要用来解决延迟不那么多的情况

当然也要权衡业务场景,如果不考虑数据的时效性,可以长时间等待

流处理从事件产生,流经 source 再到 operator,中间是有一个过程和时间的。

虽然大部分情况下,流转到 operator 的数据都是按照时间产生的时间顺序来的,但是也不排除由于网络延迟等原因,导致乱序的产生,特别是使用 Kafka 的话,多个分区的数据无法保证有序。

所以,在进行 window 计算的时候,我们不能无限期的等下去,必须要有一个机制来保证一个特定的时间后,必须触发 window 进行计算,这个特别的机制就是 WaterMark,WaterMark 适用于处理乱序事件的。WaterMark 可以翻译为水位线。

1
2
3
4
WaterMark 是一种度量 eventTime 进度的机制,
WaterMark 作为流数据中的一部分在 stream 中流动,并携带 timestamp。
一个 WaterMark(t) 表明在流中处理的 eventTime 已经到达了 t,
那么在流中就不会再有 eventTime 小于 t 的时间产生。

Window + WaterMark + eventTime 一起使用

确定了窗口的大小后,Flink 会将窗口的间隔预先划分好

Window 触发的时间、条件:

1.WaterMark 时间 >= Window_end_time

2.[ Window_start_time, Window_end_time ) 区间中有数据存在,注意是左闭右开的区间,而且是以 eventTime 来计算的

Window

聚合时间(例如计数、求和)在流数据上的工作方式与批处理不同。

对流中的所有元素进行计数是不可能的,通常流是无限的(无界的),所以流数据的聚合需要由 Window 来划定范围。

例如:计算过去 5 分钟…;最后 100 个元素的和…

Window 是一种可以把无限数据流分割为有限数据块的手段。

窗口可以是事件驱动的 [ Time Window ] (例如:每 30 秒)

或者是数据驱动的 [ Count Window ](例如:每 100 个元素)

窗口的类型

tumbling window:滚动窗口 [ 没有重叠 ]

sliding window:滑动窗口 [ 有重叠 ]

session window:会话窗口

global window:没有窗口

Flink 的灵活性

state -> 自定义算子

global window + trigger + evictor 自定义更复杂的窗口规则