Apache flink ApacheFlink:水印、删除延迟事件和允许延迟

Apache flink ApacheFlink:水印、删除延迟事件和允许延迟,apache-flink,flink-streaming,windowing,Apache Flink,Flink Streaming,Windowing,我很难理解水印和允许迟到的概念 下面是[mail archive]中的一段摘录,其中谈到了水印,但我还有几个问题。下面是引用的示例: 假设您有一个boundedAutofordernessTimestampExtractor,有一个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:1

我很难理解水印和允许迟到的概念

下面是[mail archive]中的一段摘录,其中谈到了水印,但我还有几个问题。下面是引用的示例:

假设您有一个
boundedAutofordernessTimestampExtractor
,有一个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: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:12,并在此时评估包含
[A、B、C、D]
的窗口,最后清除其状态。
稍后被忽略

允许迟到3分钟

当收到
时,窗口操作员对窗口进行评估,但其状态尚未清除。当收到
时,状态被清除(窗口点火时间12:10+3分钟允许延迟)。
再次被忽略

允许迟到5分钟

当接收到
时,窗口操作符对窗口进行评估,但其状态尚未清除。当接收到
时,再次对窗口进行评估,但这次使用
[A、B、C、D、G]
并发送更新。当接收到大于等于12:15的水印时,状态被清除

据我了解:

  • 水印应该告诉到达的任何元素的事件时间戳小于水印的时间戳都将被丢弃。因此,12:02的水印意味着Flink在事件时间12:02之前已经看到了它必须看到的所有内容。任何事件时间戳小于此水印的元素(例如12:01)都将被丢弃
  • 允许延迟的概念仅适用于标记窗口结束的最后一个水印之后
  • 我基于理解提出的问题:

  • 考虑到Flink之前的水印(WM,12:02)已经说过“我在12:02之前已经看到了一切”,消息“12:02,C”是如何被娱乐的
  • 我已经调整了流序列,并在流序列中以粗体显示的点插入了另一条记录12:01,CCC
  • 如果您具有以下流序列:

    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: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已经越过,这会被删除?

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


    在您的情况下,这意味着
    C
    CCC
    都将成为窗口
    12:00-12:10
    的一部分,因为系统还没有看到带有>=
    12:10
    水印。

    考虑水印的另一种方式是,它们触发已安排在特定时间的计算。记录C只要未对窗口进行评估,就可以将水印添加到窗口中,即直到水印超过窗口结束时间。默认情况下,评估后将删除窗口的内容(因此不能将延迟事件添加到结果中)。在允许延迟的情况下,窗口内容会被保留更长的时间,并且延迟事件可以用来更新结果。如果没有延迟元素,那么当延迟消失时,窗口是否仍会被触发。例如,窗口在t结束,窗口触发。延迟在t+2过期,但在t和t+2之间没有延迟元素到达,那么窗口c是否会被触发计算仍然被触发,或者只是状态被清除而没有任何窗口计算。@FabianHueskeI认为默认情况下,窗口结果只有在收到延迟记录时才会更新。但这可以通过自定义触发器显式控制。