Apache Flink:水印,删除延迟事件和允许延迟

时间:2019-05-09 06:17:36

标签: apache-flink flink-streaming windowing

我在理解水印的概念和允许的迟到方面遇到困难。

以下内容摘自[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的水印时,将清除状态。

据我了解:

  1. 水印应该告诉所有事件时间戳小于水印的元素都将被丢弃。因此,水印12:02意味着Flink在事件时间12:02之前已经看到了它必须看到的所有内容。事件时间戳小于此水印的任何元素,例如12:01将被丢弃。
  2. “允许延迟”的概念仅在标记窗口结束的最后一个水印之后才适用

我的问题基于以下理解:

  1. 考虑到Flink,带有上一个水印(WM,12:02)的消息“ 12:02,C”如何被娱乐,已经说:“ 在活动时间12:02之前我已经看到了一切”?
  2. 我已经调整了流序列,并在流序列中以下粗体显示的点插入了另一个记录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窗口中,但在水印WM 12:02后面。可以说允许的延迟是5分钟。会否以某种方式接受此记录,使允许的延迟出现在画面中,还是考虑到水印12:02已经越过,将其删除?

1 个答案:

答案 0 :(得分:1)

Watermarks控制窗口的生存期,但不能直接控制是否删除记录。当Flink的WindowOperator收到一条新记录时,它将计算它所属的窗口集。如果此集合包含至少一个活动窗口,这意味着没有水印的值大于该窗口的结束时间+允许的延迟,则该记录将分配给该窗口,并将成为窗口计算的一部分(即使该记录的时间戳低于上次看到的水印)。因此,可以说窗口会降低各个记录的水印分辨率。

在您的情况下,这意味着CCCC都将成为窗口12:00 - 12:10的一部分,因为系统未看到> = { {1}}。