Flink:MaxOutOfOrderness 和 AllowedLateness 的区别

Gau*_*mar 3 apache-flink flink-streaming

在 Flink 中,有两件事提供了类似的行为。两者有什么区别。

  1. MaxOutOfOrderness:与 BoundedOutOfOrdernessTimestampExtractor 一起使用。通过将事件时间后面的 Watermark 延迟 MaxOutOfOrderness 值,允许流的元素按 maxOutOfOrdeness 值的大小乱序。
  2. AllowedLateness:在此参数定义的一段时间内保持窗口状态。

当您已经可以通过 maxOutOfOrderness 实现相同的行为时,为什么还要使用 AllowedLateness。

如果您只使用 Allowedlateness,则没有必要等待,因为后期元素将无序,因此将被删除。

如果你只使用 MaxOutOfOrderness,那么它会延迟窗口计算,但它可以处理乱序事件。

Dav*_*son 6

MaxOutOfOrderness确定流的水印落后于迄今为止观察到的最大时间戳多远——这反过来又确定了任何事件时间计时器将触发的时间。这些计时器可能属于窗口或进程函数。

水印还定义了哪些事件是迟到的——时间戳小于当前水印的事件是迟到的。

窗口 API 有一个概念 允许延迟,它决定了窗口状态保留多长时间。当水印通过窗口的终点时,将触发事件时间窗口——并且在允许延迟的情况下,窗口将在每个延迟事件到达时再次触发,直到允许的延迟到期(这种触发行为可以定制——这是默认设置)。一旦允许的延迟到期,窗口的状态将被清除,此后延迟事件要么被丢弃,要么被发送到侧输出(如果配置了)。

所以,总结一下:

AllowedLateness 仅适用于事件时间窗口,而 MaxOutOfOrderness 适用于水印的所有使用(例如,进程函数)。

拥有这两种机制很有用,因为您可以让窗口在水印定义的自然窗口结束时触发,并在延迟事件到达时再次更新结果。

水印的目的是控制延迟和完整性之间的权衡。能够要求以低延迟(即相对较短的 MaxOutOfOrderness)生成结果,同时适应相当晚的事件是很有用的。

并纠正一件事:如果 MaxOutOfOrderness 为零并且有 AllowedLateness,那么您可能会有很多延迟事件(除非一切正常),但如果它们的延迟超过允许的时间,它们只会被丢弃(通过一个窗口)迟到。