流式计算中的 Window 计算| 青训营笔记

118 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的的第4天。

一、概述

1. 流式计算vs批式计算 image.png

  •  数据价值:实时性越高数据价值越高

  •  资源模型:指流式/批式使用的计算资源模型。批式计算的任务有结束时间,属于定时调度;流式计算需要实时处理和实时输出,对计算资源长期持有,没有释放资源的过程。

2. 流式计算数据的时间:

  •  Event Time(事件时间):事件真正产生的时间,它通常由事件中的时间戳描述。

    •  时间戳数据库中自动生成的唯一二进制数字,用于跟踪数据在数据库内的相对时间,而不是与时钟相关联的时间。
  •  Processing Time(处理时间):事件被处理时,当前的系统时间,默认使用的就是这个词。

image.png

  •  Watermark+Window解决数据的延迟与乱序

    流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络延迟等原因,导致乱序的产生,特别是使用kafka的话,多个分区的数据无法保证有序。所以在进行window计算的时候,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark(水位线)。Watermark是用于处理乱序事件的,用于衡量Event Time进展的机制。

二、Watermark

1. Watermark:当前系统认为的事件时间所在的真实时间,核心本质可以理解成一个延迟触发机制。在 Flink 的窗口处理过程中,如果确定全部数据到达,就可以对 Window 的所有数据做 窗口计算操作(如汇总、分组等),如果数据没有全部到达,则继续等待该窗口中的数据全 部到达才开始处理。这种情况下就需要用到水位线(WaterMarks)机制,它能够衡量数据处 理进度(表达数据到达的完整性),保证事件数据(全部)到达 Flink 系统,或者在乱序及 延迟到达时,也能够像预期一样计算出正确并且连续的结果。

2. Watermark的生成方式:当任何 Event 进入到 Flink 系统时,会根据当前最大事件时间产生 Watermarks 时间戳,通常在接收到source的数据后,应该立即生成watermark,然后watermark随着数据流向传输。

3. Watermark的计算:Watermark =进入Flink 的最大的事件时间(mxtEventTime)-指定的延迟时间(t)

4. Whatermark触发窗口函数:如果有窗口的停止时间等于或者小于 maxEventTime - t(当时的warkmark),那么这个窗口被触发执行。

5 . wantermark的三种应用场景:

  •  有序流中的wartermark image.png

  •  无序流中的watermark image.png

  •  多并行度中的watermark image.png

    类似于Checkpoint的制作过程,传递就类似于Checkpoint的barrier,上下游task之间有数据传输关系的,上游就会将watermark传递给下游;下游收到多个上游传递过来的watermark后,默认会取其中最小值来作为自身的watermark,同时它也会将自己watermark传递给它的下游。经过整个传递过程,最终系统中每一个计算单元就都会实时的知道自身当前的watermark是多少

5. 迟到事件的处理

迟到事件是乱序事件的特例,和一般乱序事件不同的是它们的乱序程度超出了水位线的预计,导致窗口在它们到达之前已经关闭。 迟到事件出现时窗口已经关闭并产出了计算结果,因此处理的方法有3种:

重新激活已经关闭的窗口并重新计算以修正结果。

将迟到事件收集起来另外处理。

将迟到事件视为错误消息并丢弃。

Flink 默认的处理方式是直接丢弃。

三、Window

据不同的业务场景,Time Window 也可以分为三种类型,分别是滚动窗口(TumblingWindow)、滑动窗口(Sliding Window)和会话窗口(Session Window)。

1. 滚动窗口(TumblingWindow)

滚动窗口是根据固定时间进行切分,且窗口和窗口之间的元素互不重叠。这种类型的窗口的最大特点是比较简单。只需要指定一个窗口长度(window size)。 image.png 2. 滑动窗口(Sliding Window)

滑动窗口也是一种比较常见的窗口类型,其特点是在滚动窗口基础之上增加了窗口滑动时间(Slide Time),且允许窗口数据发生重叠。当 Windows size 固定之后,窗口并不像滚动窗口按照 Windows Size 向前移动,而是根据设定的 Slide Time 向前滑动。窗口之间的数据重叠大小根据 Windows size 和 Slide time决定,当 Slide time 小于 Windows size便会发生窗口重叠,Slide size 大于 Windows size 就会出现窗口不连续,数据可能不能在任何一个窗口内计算,Slide size 和 Windows size 相等时,Sliding Windows 其实就是Tumbling Windows。 image.png 3. 会话窗口(Session Window)

会话窗口(Session Windows)主要是将某段时间内活跃度较高的数据聚合成一个窗口进行计算,窗口的触发的条件是 Session Gap,是指在规定的时间内如果没有数据活跃接入,则认为窗口结束,然后触发窗口计算结果。需要注意的是如果数据一直不间断地进入窗口,也会导致窗口始终不触发的情况。与滑动窗口、滚动窗口不同的是,Session Windows 不需要有固定 windows size 和 slide time,只需要定义 session gap,来规定不活跃数据的时间上限即可。 image.png