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

cl25kdpy  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(350)

我很难理解水印和允许延迟的概念。
以下是[邮件存档]的摘录|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已经过了,该记录是否会被删除?

gzszwxb4

gzszwxb41#

这个 Watermarks 控制窗口的生存期,但不直接控制是否删除记录。当Flink WindowOperator 接收新记录时,它将计算它所属的一组窗口。如果此集合至少包含一个活动窗口,这意味着没有比窗口的结束时间+允许的延迟值更高的水印,则记录将被分配给此窗口,并将成为窗口计算的一部分(即使记录的时间戳低于上次看到的水印)。因此,可以说windows降低了水印相对于单个记录的分辨率。
对你来说,这意味着 C 以及 CCC 将成为Windows的一部分 12:00 - 12:10 因为系统没有看到 Watermark 有>= 12:10 ,但是。

相关问题