结论:窗口的关闭需要带 watermarker 的时间我想使用 kafkaUI 界面发送 json 数据给 kafka,json 数据长这个样子:这个数据我是编写了一个代码生成的:编写一个 flink 读取 kafka 数据的代码这个代码中可以读取 kafka 数据,并且必须使用 evenetTime 时间语义,并且还需要有watermarker+allowedLateness开始测试:使用 kafkaUI 界面发送第一条数据:我使用时间戳转换器看一下是什么时候:https://www.beijing-time.org/shijianchuo/1764303530000 = 12:18:50 也就意味着 第一个区间是 [12:18:50,12:18:55)接着在这个区间造一些数据:
javascript
{"money":47,"orderId":"6ce94dcefaac4106bb7b66302bb9e785","timeStamp":1764303531000,"uid":0}
{"money":47,"orderId":"6ce94dcefaac4106bb7b66302bb9e785","timeStamp":1764303532000,"uid":0}
控制台不会有输出,因为没有触发。输入以下数据可以触发:12:18:58
javascript
{"money":47,"orderId":"6ce94dcefaac4106bb7b66302bb9e785","timeStamp":1764303538000,"uid":0}
控制台输出了数据:
2025-11-28 12:18:50->2025-11-28 12:18:55->0-->141
得到了一个结论: 水印时间 (12:18:58)>= 区间结束时间 就会触发该区间的计算 【2025-11-28 12:18:50->2025-11-28 12:18:55)此时这个 【2025-11-28 12:18:50->2025-11-28 12:18:55) 区间触发了,没有关闭接着在这个区间【2025-11-28 12:18:50->2025-11-28 12:18:55)继续放入数据:
java
{"money":47,"orderId":"6ce94dcefaac4106bb7b66302bb9e785","timeStamp":1764303533000,"uid":0}
{"money":47,"orderId":"6ce94dcefaac4106bb7b66302bb9e785","timeStamp":1764303534000,"uid":0}
我们在这个里面又放入了12:18:53 12:18:54 的数据,放入一条,计算一次,放入一条计算一次,为什么?触发条件不是当前的时间-3 ,而是 最大的那个时间 -3 ,以前放的最大的事件时间是12:18:58接着造一个 结束时间+10s 的数据:
java
{"money":47,"orderId":"6ce94dcefaac4106bb7b66302bb9e785","timeStamp":1764303545000,"uid":0}
此时触发了一个区间的运行 【2025-11-28 12:18:55->2025-11-28 12:19:00) ,我们不关系,而关系的是【2025-11-28 12:18:50->2025-11-28 12:18:55) 有没有关闭?按照以前的理解,事件时间>= 窗口的结束时间+ allowedLateness 就关闭该窗口,如何测试呢?
java
{"money":47,"orderId":"6ce94dcefaac4106bb7b66302bb9e785","timeStamp":1764303533000,"uid":0}
发现依然输出了结果,说明 添加了allowedLateness 之后,窗口的结束时间 不是 事件时间>= 窗口的结束时间+ allowedLateness那关闭时间到底是多少?事件时间 >= 窗口结束12:18:55 + watermarker(3s) + allowedLateness(10s)接着需要造一个数据:12:19:08 秒
java
{"money":47,"orderId":"6ce94dcefaac4106bb7b66302bb9e785","timeStamp":1764303548000,"uid":0}
发现没有任何的输出,接着测试 【2025-11-28 12:18:50->2025-11-28 12:18:55) 是否关闭:
javascript
{"money":47,"orderId":"6ce94dcefaac4106bb7b66302bb9e785","timeStamp":1764303533000,"uid":0}