- 使用processingTime会话窗口且不重写水印函数动态获取的时间,此时eventTime和processTime没有区别,窗口只能用数据到达的窗口算子的时间作为窗口开启时间。
会话窗口1s内无数据则关闭窗口,触发计算。
source每隔100毫秒发出一条数据,发出4条数据后睡眠1.5秒。
窗口接收到第一条数据时开启窗口,开启时间明显能看出比source发出数据的时间多了几十毫秒。然后后面每接到一条数据都会从这条数据到达的时间开始延长这个会话窗口时间1s。
所以窗口时间关闭应该是第四条数据发出时间+1s+几十毫秒。6823 - 5746 = 1077 < 1500, 所以,时间间隔内,没有新数据到达,窗口关闭
- 使用EventTime会话窗口且不重写时间戳和水印函数,则无法开启和关闭窗口,它不知道以哪个时间作为窗口开启时间。
- 使用EventTime会话窗口且设置eventTime和水印
使用collectWithTimestamp,发出且设置元素eventTime, 使用emitWatermark,设置下发的水印
可以看出,窗口开启时间是元素发出的eventTime,窗口结束时间也是元素发出的1s后时间,2472-1472 = 1000
而且,窗口结束时间跟真正关闭触发计算不一样,窗口需要接收到下一个元素,且已经迟到的元素后,当前窗口才会进行真正关闭计算,迟到的元素进入下一个窗口,重复。。。
所以计算时间应当是大于接收到第一个迟到的元素后一点时间。
- 当水印生成多于事件1s时,窗口接收到水印更新,发现时间已经大于事件时间1s了,再接收到元素,关闭窗口。如此下来,每次水位更新都是比元素发出多1s,窗口最多只会有一个元素。
- 如果水印一直多两秒,两秒大于窗口间隔,第一个元素和前面的一样。后面每一个到来时,如果元素时间加上窗口间隔时间>当前水位时间,说明元素可以进入窗口
例如第5个,3553+1000 > 2048+2000