Apache Flink:水印、丢弃迟到事件和允许迟到

She*_*oli 5 windowing apache-flink flink-streaming

我无法理解水印和允许迟到的概念。

以下是 [邮件存档| 的摘录] https://www.mail-archive.com/user@flink.apache.org/msg08758.html]讨论了水印,但我还有几个问题。以下是引用的例子:

假设您有一个BoundedOutOfOrdernessTimestampExtractor2 分钟限制和 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
Run Code Online (Sandbox Code Playgroud)

不允许迟到

当窗口操作符接收并评估此时<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 为止的所有内容”,消息“12:02,C”如何被接受?
  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
Run Code Online (Sandbox Code Playgroud)

这仍然在 12:00-12:10 窗口中,但位于水印 WM 12:02 后面。假设允许迟到 5 分钟。该记录是否会“以某种方式”被接受,将允许的迟到纳入考虑范围,或者考虑到水印 12:02 已经跨越,该记录是否会被删除?

Til*_*ann 6

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

在您的情况下,这意味着 和 都CCCC成为窗口的一部分12:00 - 12:10,因为系统还没有看到Watermarkwith >= 12:10

  • 考虑水印的另一种方式是它们触发已安排在特定时间的计算。只要窗口未被评估,即直到水印超过窗口结束时间,就可以将记录添加到窗口。默认情况下,窗口的内容在评估后将被删除(因此后期事件无法添加到结果中)。在允许的延迟情况下,窗口内容会保留更长的时间,并且可以使用延迟事件来更新结果。 (3认同)