我看到有很多关于添加对每个密钥水印的支持的讨论正在进行。但是flink支持每个分区的水印吗?
当前-然后考虑所有水印(非空闲分区(中的最小值。正因为如此,最后挂在窗户上的唱片也被卡住了。(当使用periodicemit增加水印时(
任何关于这方面的信息都非常感谢!
一些源,如FlinkKafkaConsumer
,支持每分区水印。通过在源上调用assignTimestampsAndWatermarks
,而不是在源生成的流上调用CCD2。
这样做的目的是,每个使用者实例跟踪每个分区内的最大时间戳,并将这些最大值中的最小值作为其水印,减去配置的有界无序。空闲分区将被忽略,如果你配置它这样做
这不仅可以产生更准确的水印,而且如果您的事件在每个分区内都是有序的,这也可以利用WatermarkStrategy.forMonotonousTimestamps()
策略。
有关更多详细信息,请参阅水印策略和Kafka连接器。
至于为什么最后一个窗口没有被触发,这与水印有关,但与每个分区的水印无关。问题很简单,窗口是由水印触发的,并且水印落后于事件中的时间戳。因此,水印永远无法赶上最终事件,也永远无法触发最后一个窗口。
这对无限制的流媒体工作来说不是问题,因为它们从未停止,也从未有最后一个窗口。这对批处理作业来说不是问题,因为他们知道所有的数据。但对于有限制的流媒体工作,你需要做一些事情来解决这个问题。一般来说,您必须通知Flink输入流已经结束——每当Flink源检测到它们已经到达基于事件时间的输入流的末尾时,它们就会发出最后一个水印,其值为MAX_watermark,这将触发任何打开的窗口。
一种方法是将KafkaDeserializationSchema
与isEndOfStream
的实现一起使用,该实现在作业结束时返回true。