这是我参与「第四届青训营 」笔记创作活动的的第4天。
一、概述
1. 流式计算vs批式计算
-
数据价值:实时性越高数据价值越高
-
资源模型:指流式/批式使用的计算资源模型。批式计算的任务有结束时间,属于定时调度;流式计算需要实时处理和实时输出,对计算资源长期持有,没有释放资源的过程。
2. 流式计算数据的时间:
-
Event Time(事件时间):事件真正产生的时间,它通常由事件中的时间戳描述。
- 时间戳数据库中自动生成的唯一二进制数字,用于跟踪数据在数据库内的相对时间,而不是与时钟相关联的时间。
-
Processing Time(处理时间):事件被处理时,当前的系统时间,默认使用的就是这个词。
-
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
-
无序流中的watermark
-
多并行度中的watermark
类似于Checkpoint的制作过程,传递就类似于Checkpoint的barrier,上下游task之间有数据传输关系的,上游就会将watermark传递给下游;下游收到多个上游传递过来的watermark后,默认会取其中最小值来作为自身的watermark,同时它也会将自己watermark传递给它的下游。经过整个传递过程,最终系统中每一个计算单元就都会实时的知道自身当前的watermark是多少
5. 迟到事件的处理
迟到事件是乱序事件的特例,和一般乱序事件不同的是它们的乱序程度超出了水位线的预计,导致窗口在它们到达之前已经关闭。 迟到事件出现时窗口已经关闭并产出了计算结果,因此处理的方法有3种:
重新激活已经关闭的窗口并重新计算以修正结果。
将迟到事件收集起来另外处理。
将迟到事件视为错误消息并丢弃。
Flink 默认的处理方式是直接丢弃。
三、Window
据不同的业务场景,Time Window 也可以分为三种类型,分别是滚动窗口(TumblingWindow)、滑动窗口(Sliding Window)和会话窗口(Session Window)。
1. 滚动窗口(TumblingWindow)
滚动窗口是根据固定时间进行切分,且窗口和窗口之间的元素互不重叠。这种类型的窗口的最大特点是比较简单。只需要指定一个窗口长度(window size)。
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。
3. 会话窗口(Session Window)
会话窗口(Session Windows)主要是将某段时间内活跃度较高的数据聚合成一个窗口进行计算,窗口的触发的条件是 Session Gap,是指在规定的时间内如果没有数据活跃接入,则认为窗口结束,然后触发窗口计算结果。需要注意的是如果数据一直不间断地进入窗口,也会导致窗口始终不触发的情况。与滑动窗口、滚动窗口不同的是,Session Windows 不需要有固定 windows size 和 slide time,只需要定义 session gap,来规定不活跃数据的时间上限即可。