我很难理解水印和允许延迟的概念。
以下是[邮件存档]的摘录|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之前已经看到了它必须看到的一切。任何事件timesatamp小于此水印的元素(例如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: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窗口中,但在12:02水印wm后面。假设允许迟到5分钟。该记录是否会被接受“以某种方式”将允许的延迟引入到图片中,或者考虑到水印12:02已经过了,该记录是否会被删除?
1条答案
按热度按时间gzszwxb41#
这个
Watermarks
控制窗口的生存期,但不直接控制是否删除记录。当FlinkWindowOperator
接收新记录时,它将计算它所属的一组窗口。如果此集合至少包含一个活动窗口,这意味着没有比窗口的结束时间+允许的延迟值更高的水印,则记录将被分配给此窗口,并将成为窗口计算的一部分(即使记录的时间戳低于上次看到的水印)。因此,可以说windows降低了水印相对于单个记录的分辨率。对你来说,这意味着
C
以及CCC
将成为Windows的一部分12:00 - 12:10
因为系统没有看到Watermark
有>=12:10
,但是。