Flink中的事件语义和watermark机制
【[白话解析] Flink的Watermark机制】:https://www.cnblogs.com/rossiXYZ/p/12286407.html
一、Flink窗口(window)
1、窗口(window)的作用
窗口(window)是将无限流切割为有限流的一种方式,它会将流数据分发到有限大小的桶(bucket)中进行分析。
2、window类型
时间窗口:滚动时间窗口、滑动时间窗口、会话窗口。
计数窗口:滚动计数窗口、滑动计数窗口。
滚动时间窗口
特点:时间对齐,窗口长度固定,没有重叠。
滑动时间窗口
特点:窗口大小、滑动步长固定,可以有重叠。
会话时间窗口
特点:指定固定时间间隙。
二、Flink时间语义
1、时间语义
<u><u>Event Time:事件时间。(流事件的时间戳)</u></u>
Ingestion Time:提取事件,事件进入Flink的事件。
Processing Time:执行操作算子的本地系统事件,与机器无关。
2、乱序数据的影响
当Flink以Event Time模式处理数据流时,它会根据数据里的时间戳来处理基于时间的算子。
由于网络、分布式等原因,会导致乱序数据的产生。
乱序数据会让窗口计算不准确。
三、Flink对乱序时间处理
解决方案:Watermark/allowLateNess/sideOutPut
1、水位线(Watermark)
Watermark:遇到一个时间戳达到了窗口关闭时间,<u><u>不应该立刻触发窗口计算</u></u>,而是等待一段时间,等迟到的数据来了再关闭窗口。
2、allowLateNess
allowLateNess:<u><u>达到窗口关闭时间,触发窗口计算,但窗口关闭时间延长。</u></u>
优点:机制允许用户设置一个允许的最大迟到时长,这期间的迟到时间不会被丢弃,而是默认会触发窗口重新计算。
缺点:因为保存窗口状态需要额外内存,并且迟到事件会触发窗口的全量计算,代价比较大,所以允许迟到时长不应设的太长,迟到事件不宜过多。
注:设置Watermark设置的延迟时间不结束不会输出结果,而allowLateNess在时间结束后会输出结果但窗口不会关闭,会在设置的延迟时间内更新结果。
3、sideOutPut
sideOutPut:当指定窗口彻底关闭后,就会把所有过期延迟数据放到侧输出流,让用户决定如何处理。