我在理解水印的概念和允许的迟到方面遇到困难。
以下内容摘自[mail archive | 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
不允许迟到
窗口操作符在收到
<WM, 12:12>
时将逻辑时间转发到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: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窗口中,但在水印WM 12:02后面。可以说允许的延迟是5分钟。会否以某种方式接受此记录,使允许的延迟出现在画面中,还是考虑到水印12:02已经越过,将其删除?
答案 0 :(得分:1)
Watermarks
控制窗口的生存期,但不能直接控制是否删除记录。当Flink的WindowOperator
收到一条新记录时,它将计算它所属的窗口集。如果此集合包含至少一个活动窗口,这意味着没有水印的值大于该窗口的结束时间+允许的延迟,则该记录将分配给该窗口,并将成为窗口计算的一部分(即使该记录的时间戳低于上次看到的水印)。因此,可以说窗口会降低各个记录的水印分辨率。
在您的情况下,这意味着C
和CCC
都将成为窗口12:00 - 12:10
的一部分,因为系统未看到> = { {1}}。