Watermark+EventTime处理乱序数据。
上小节的测试,数据都是按照时间顺序递增的,现在我们输入一些乱序的数据,看看Watermark结合EventTime机制,是如何处理乱序数据的。
我们在上小节的基础上,再输入两行乱序的数据。
[root@master ~]# nc -l 9001
...
0001,1790820699000
0001,1790820691000
可以看到,虽然我们输入了一个10:11:31的数据,但是currentMaxTimestamp和Watermark 都没变。此时,按照我们上小节提到的公式。 1. watermark 时间 >=window_end_time 2. 在[window_start_time,window_end_time)中有数据存在
Watermark 时间(10:11:29) < window_end_time (10:11:33),因此不能触发 Window。
那如果我们再次输入一条10:11:43的数据,此时Watermark时间会上升到10:11:33,这时的Window一定就会触发了,我们继续输入内容。
[root@master ~]# nc -l 9001
...
0001,1790820703000
运行结果:
key:0001,eventtime:[1790820699000|2026-10-01 10:11:39],currentMaxTimstamp:[1790820689000|2026-10-01 10:11:39],watermark:[1790820689000|2026-10-01 10:11:29]
(0001),1,2026-10-01 10:11:26,2026-10-01 10:11:26,2026-10-01 10:11:24,2026-10-01 10:11:27
key:0001,eventtime:[1790820691000|2026-10-01 10:11:31],currentMaxTimstamp:[1790820689000|2026-10-01 10:11:39],watermark:[1790820689000|2026-10-01 10:11:29]
key:0001,eventtime:[1790820703000|2026-10-01 10:11:43],currentMaxTimstamp:[1790820693000|2026-10-01 10:11:43],watermark:[1790820693000|2026-10-01 10:11:33]
(0001),2,2026-10-01 10:11:31,2026-10-01 10:11:32,2026-10-01 10:11:30,2026-10-01 10:11:33
这里我们可以看到,窗口中有2个数据,10:11:31和10:11:32,但是没有10:11:33的数据, 原因是窗口是一个前闭后开的区间,10:11:33的数据是属于[10:11:33,10:11:36)这个窗口的。