Flink中的事件语义和watermark机制

Flink中的事件语义和watermark机制

【[白话解析] Flink的Watermark机制】:https://www.cnblogs.com/rossiXYZ/p/12286407.html

一、Flink窗口(window)

1、窗口(window)的作用

窗口(window)是将无限流切割为有限流的一种方式,它会将流数据分发到有限大小的桶(bucket)中进行分析。

2、window类型

时间窗口:滚动时间窗口、滑动时间窗口、会话窗口。

计数窗口:滚动计数窗口、滑动计数窗口。

滚动时间窗口

image-20210416173150865.png

特点:时间对齐,窗口长度固定,没有重叠。

滑动时间窗口

image-20210416173409667.png

特点:窗口大小、滑动步长固定,可以有重叠。

会话时间窗口

image-20210416173626952.png

特点:指定固定时间间隙。

二、Flink时间语义

1、时间语义

image-20210412105849498.png

Event Time:事件时间。(流事件的时间戳)

Ingestion Time:提取事件,事件进入Flink的事件。

Processing Time:执行操作算子的本地系统事件,与机器无关。

2、乱序数据的影响

image-20210416174830412.png

当Flink以Event Time模式处理数据流时,它会根据数据里的时间戳来处理基于时间的算子。

由于网络、分布式等原因,会导致乱序数据的产生。

乱序数据会让窗口计算不准确。

三、Flink对乱序时间处理

解决方案:Watermark/allowLateNess/sideOutPut

1、水位线(Watermark)

Watermark:遇到一个时间戳达到了窗口关闭时间,不应该立刻触发窗口计算,而是等待一段时间,等迟到的数据来了再关闭窗口。

2、allowLateNess

allowLateNess:达到窗口关闭时间,触发窗口计算,但窗口关闭时间延长。

优点:机制允许用户设置一个允许的最大迟到时长,这期间的迟到时间不会被丢弃,而是默认会触发窗口重新计算。

缺点:因为保存窗口状态需要额外内存,并且迟到事件会触发窗口的全量计算,代价比较大,所以允许迟到时长不应设的太长,迟到事件不宜过多。

注:设置Watermark设置的延迟时间不结束不会输出结果,而allowLateNess在时间结束后会输出结果但窗口不会关闭,会在设置的延迟时间内更新结果。

3、sideOutPut

sideOutPut:当指定窗口彻底关闭后,就会把所有过期延迟数据放到侧输出流,让用户决定如何处理。

你可能感兴趣的:(Flink中的事件语义和watermark机制)