本文章基于以下两个视频的一点理解:
https://www.bilibili.com/video/BV1qy4y1q728?p=51
https://www.bilibili.com/video/BV1qy4y1q728?p=52
假设以event-time作为时间,延迟2秒,窗口大小是5秒。
注意:flink可以同时存在两个窗口的数据在等待计算。
理解一:
1、时间戳1的数据到来,时间范围在[0,5)内,数据进入桶[0,5)
2、时间戳4的数据到来,时间范围在[0,5)内,数据进入桶[0,5)
3、时间戳5的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
因为延迟是2秒,设置窗口[0,5)的水位线为7=5+2,桶[0,5)的数据还没触发计算。
4、时间戳2的数据到来,时间范围在[0,5)内而且没有大于或等于水位线7,数据进入桶[0,5)
5、时间戳3的数据到来,时间范围在[0,5)内而且没有大于或等于水位线7,数据进入桶[0,5)
6、时间戳6的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
7、时间戳7的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
因为时间戳7不小于窗口[0,5)的水位线7,触发窗口[0,5)的计算
后面再来时间戳在[0,5)的数据都会被丢掉
8、时间戳5的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
9、时间戳8的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
10、时间戳5的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
11、假设时间戳12的数据到来,时间范围在[10,15),数据进入桶[10,15)
因为延迟是2秒,设置窗口[5,10)的水位线为14=12+2,桶[5,10)的数据还没触发计算
12、假设时间戳9的数据到来,时间范围在[5,10)内而且没有大于或等于水位线14,数据进入 桶[5,10)
13、假设时间戳10的数据到来,时间范围在[10,15),数据进入桶[10,15)
14、假设时间戳14的数据到来,时间范围在[10,15),数据进入桶[10,15)
因为时间戳14不小于窗口[5,10)的数位线14,触发窗口[5,10)的计算
后面再来时间戳在[5,10)的数据都会被丢掉
15、同理
理解二:
1、时间戳1的数据到来,时间范围在[0,5)内,数据进入桶[0,5)
2、时间戳4的数据到来,时间范围在[0,5)内,数据进入桶[0,5)
3、时间戳5的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
因为延迟是2秒,窗口[0,5)的数据会等待2秒再进行计算,在这2秒内如果还有时间戳在 [0,5)的数据则进入桶[0,5),譬如后面的2和3,6则进入桶[5,10)
4、2秒过后计算窗口[0,5)的数据
5、同理
理解三:这个理解最符合
watermark本质上是一个时间戳,且是动态变化的,会根据当前最大事件时间产生。watermarks具体计算为:
watermark = 进入 Flink 窗口的最大的事件时间(maxEventTime)减去指定的延迟时间(t)
当watermark时间戳大于等于窗口结束时间时,意味着窗口结束,需要触发窗口计算。
1、时间戳1的数据到来,watermark=1-2=-1,小于窗口[0,5)的5,数据进入桶[0,5)
2、时间戳4的数据到来,watermark=4-2=2,小于窗口[0,5)的5,数据进入桶[0,5)
3、时间戳5的数据到来,watermark=5-2=3,小于窗口[0,5)的5,数据进入桶[5,10)
4、时间戳2的数据到来,watermark=3不变,小于窗口[0,5)的5,数据进入桶[0,5)
5、时间戳3的数据到来,watermark=3不变,小于窗口[0,5)的5,数据进入桶[0,5)
6、时间戳6的数据到来,watermark=6-2=4,
小于窗口[0,5)的5,小于窗口[5,10)的10,数据进入桶[5,10)
7、时间戳7的数据到来,watermark=7-2=5,
不小于窗口[0,5)的5,触发窗口[0,5)的计算,小于窗口[5,10)的10,进入桶[5,10)
8、假设时间戳12的数据到来,watermark=12-2=10,
不小于窗口[5,10)的10,触发窗口[5,10)的计算,数据进入桶[10,15)
9、同理
辅助理解文章: