我很难理解水印的概念并允许迟到。
以下是[邮件存档| https://www.mail-archive.com/user@flink.apache.org/msg08758.html]的摘录,它谈论了水印,但我仍然有几个问题。以下是引用的示例。:
假设您有一个
BoundedOutOfOrdernessTimestampExtractor
,带有2分钟的绑定和10分钟的翻滚窗口,该窗口从12:00开始,在12:10结束:如果您有以下流序列:
12:01, A 12:04, B WM, 12:02 // 12:04 - 2 minutes 12:02, C 12:08, D 12:14, E WM, 12:12 12:16, F WM, 12:14 // 12:16 - 2 minutes 12:09, G
不允许迟到
窗口运算符将逻辑时间转发至12:12它接收
<WM, 12:12>
并评估此时包含[A, B, C, D]
并最终清除其状态的窗口。<12:09, G>
后来被忽略。允许迟到3分钟
接收到
<WM, 12:12>
时,窗口操作员评估窗口,但尚未清除其状态。收到<WM, 12:14>
时清除状态(窗户火时间12:10 3分钟允许延迟(。<12:09, G>
再次被忽略。允许迟到5分钟
接收到
<WM, 12:12>
时,窗口操作员会评估窗口,但尚未清除其状态。收到<12:09, G>
后,再次评估窗口,但是这次使用[A, B, C, D, G]
并发送更新。当收到> = 12:15的水印时,该状态将被清除。
我了解:
- 一个水印应该说明,任何带有事件时间戳的元素都将被删除。因此,12:02的水印意味着Flink已经看到了它必须看到的一切,直到活动时间12:02。任何具有事件时间ATAMP的元素要比此水印要小,例如12:01将被丢弃。
- 允许迟到的概念仅在标记窗户末端的最后一个水印之后才适用
我的问题基于理解:
- 考虑到Flink的消息" 12:02,c"是如何带有以前的水印(WM,12:02(的Flink,已经说过" 我已经看过一切,直到活动时间12:02 "?
- 我已经调整了流序列,并在流序列中以BOLD为BOLD所示的点插入了另一个记录12:01,CCC。
如果您有以下流序列:
12:01, A 12:04, B WM, 12:02 // 12:04 - 2 minutes 12:02, C 12:01, CCC // Inserted by Sheel 12:08, D 12:14, E WM, 12:12 12:16, F WM, 12:14 // 12:16 - 2 minutes 12:09, G
这仍然在12:00-12:10窗口中,但在Watermark Wm的后面,12:02。假设允许的迟到为5分钟。是否会接受此记录"某种程度上"将允许的迟到带入图片中,还是考虑到水印12:02已经越过?
Watermarks
控制窗口的寿命,而不是直接删除记录。当Flink的WindowOperator
收到新记录时,它将计算其掉入其中的窗口集。如果此集合至少包含一个活动窗口,则意味着没有高于窗口的末端时间 允许迟到的水印,将记录分配给此窗口,并将成为窗口计算的一部分(即使记录的时间戳低于最后一个看到的水印(。因此,可以说窗户减少了有关单个记录的水印的分辨率。
在您的情况下,这意味着C
和CCC
都将成为窗口12:00 - 12:10
的一部分,因为系统尚未看到> = 12:10
的Watermark
,但是。