Apache flink Flink流媒体事件时间窗口排序

Apache flink Flink流媒体事件时间窗口排序,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我在理解事件时间窗口的语义方面遇到了一些困难。下面的程序生成一些带有时间戳的元组,这些元组用作事件时间,并执行简单的窗口聚合。我希望输出与输入的顺序相同,但输出的顺序不同。为什么输出与事件时间不符 import java.util.concurrent.TimeUnit 导入org.apache.flink.streaming.api.TimeCharacteristic 导入org.apache.flink.streaming.api.windowing.time.time 导入org.apa

我在理解事件时间窗口的语义方面遇到了一些困难。下面的程序生成一些带有时间戳的元组,这些元组用作事件时间,并执行简单的窗口聚合。我希望输出与输入的顺序相同,但输出的顺序不同。为什么输出与事件时间不符

import java.util.concurrent.TimeUnit
导入org.apache.flink.streaming.api.TimeCharacteristic
导入org.apache.flink.streaming.api.windowing.time.time
导入org.apache.flink.streaming.api.scala_
对象窗口示例扩展应用程序{
val env=StreamExecutionEnvironment.getExecutionEnvironment
环境setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.getConfig.enableTimestStamps()
环境设置(1)
val start=1449597577379L
val元组=(1到10).map(t=>(开始+t*1000,t))
环境fromCollection(元组)
.分配AscendingTimeStamps(u._1)
.timeWindowAll(时间(1,时间单位秒))
.sum(1)
.print()
env.execute()
}
输入:

 (1449597578379,1)
 (1449597579379,2)
 (1449597580379,3)
 (1449597581379,4)
 (1449597582379,5)
 (1449597583379,6)
 (1449597584379,7)
 (1449597585379,8)
 (1449597586379,9)
 (1449597587379,10)
结果:

[info] (1449597579379,2)
[info] (1449597581379,4)
[info] (1449597583379,6)
[info] (1449597585379,8)
[info] (1449597587379,10)
[info] (1449597578379,1)
[info] (1449597580379,3)
[info] (1449597582379,5)
[info] (1449597584379,7)
[info] (1449597586379,9)

这种行为的原因是,在Flink中,没有考虑元素的顺序(相对于时间戳)。只有水印的正确性和它们与元素的时间戳的关系对于考虑时间的操作是重要的,因为水印通常在基于时间的操作中触发计算。 在您的示例中,窗口操作符将源中的所有元素存储在内部窗口缓冲区中。然后,源发出一个水印,表示时间戳较小的元素将来不会到达。这反过来会告诉窗口操作符处理结束时间戳低于水印的所有窗口(对所有窗口都是如此)。因此,它会发出所有窗口(具有任意顺序),然后它会自己发出水印。此操作的下游操作本身将接收元素,并且一旦接收到水印,就可以进行处理


默认情况下,从源发射水印的间隔为200 ms。由于源发射的元素数量较少,因此在发射第一个水印之前,所有元素都会发射。在真实世界的用例中,水印发射间隔比窗口大小小得多,您将获得按时间戳顺序发射的窗口的预期行为。例如,如果每500毫秒有1个小时的窗口和水印。

您能否给出或指出一个下游操作的示例,该操作可以在收到水印后根据事件时间重新排序元素?谢谢大家!@MaximKolchin此类重新排序发生在CEP库中。您可以在这里查看: