每隔3秒统计前3秒的元素个数,那么flink系统会事先在系统中划分好20(60/3)个window
制定watermark的策略: 周期性提取watermark,默认时间为200ms,我们可以认为在1号数据被分配到window之后的200ms,flink系统就开始计算水位线了
假设允许数据乱序的最大时间为10秒 数据开始流入flink系统
1号数据 01:01:22---hello
2号数据 01:01:35---flink
在此之后 又来一条数据(迟到) 3号数据 01:01:23---later
第一条数据流入 01:01:22---hello
这条数据的event time是01:01:22, 那么它将会被放置到[00:00:21-00:00:24)窗口内
(100ms后)此时水位线(Watermark)为 12 (22-10)
Watermark(12) < WindowEndTime(24) 所以 不会触发该window的计算
第二条数据流入 01:01:35---flink
这条数据的event time是01:01:35, 那么它会被放置在[00:00:33-00:00:36)窗口内
(100ms后)此时水位线(Watermark)为 25 (35-10)
由于Watermark(25) >= WindowEndTime(24), 所以 会触发水位线(25)之前window的计算, ([21, 24))
计算后窗口直接销毁
第三条数据流入 01:01:23---later
正常情况下数据应放到[00:00:21-00:00:24)窗口, 由于此窗口被销毁,所以数据被丢弃
为保证数据完整性,修改 AllowedLateness 为2s 也就是窗口触发计算后2s再销毁
(35-37流入)这条数据的event time是01:01:23,
那么它将会被放置到[00:00:21-00:00:24)窗口(此窗口在37时会被销毁)内
(100ms后)此时计算水位线: 23-10=13 < Watermark=25, 所以水位线不变仍为25
由于 Watermark(25) < WindowEndTime(24) + AllowedLateness(2),
所以 [00:00:21-00:00:24)窗口会再次(多次)触发
此时, 窗口销毁时机 Watermark >= WindowEndTime + AllowedLateness
参考链接(侵删): https://blog.csdn.net/believe2017slwx/article/details/79978244
flink可以基于窗口对在流上对数据进行聚合操作。flink支持的窗口有:
Stream中的记录时,记录中通常会包含各种典型的时间字段,Flink支持多种时间的处理:
原文:https://www.cnblogs.com/Hephaestus/p/13616526.html