在Flink中,有两件事提供相似的行为。两者之间有什么区别。
当您已经可以通过maxOutOfOrderness实现相同的行为时,为什么要使用AllowedLateness。
如果仅使用Allowedlateness,则没有任何等待点,因为后期元素将乱序,因此将被删除。
如果仅使用MaxOutOfOrderness,则它将延迟窗口计算,但可以处理乱序事件。
MaxOutOfOrderness确定流的水印滞后到目前为止观察到的最大时间戳的距离-进而确定何时触发任何事件时间计时器。这些计时器可能属于Windows或进程功能。
水印还定义了哪些事件是迟到的-时间戳小于当前水印的事件是迟到的。
窗口API具有允许的延迟的概念,该概念确定将窗口状态保留多长时间。当水印通过窗口的终点时,事件时间窗口将触发-如果存在允许的延迟时间,则随着每个延迟事件的到来,该窗口将再次触发,直到允许的延迟时间到期为止(这种触发行为可以进行自定义-这是默认设置)。一旦允许的延迟过期,窗口的状态将被清除,此后延迟事件将被丢弃或发送到侧面输出(如果已配置)。
所以,总结一下:
AllowedLateness仅适用于事件时间窗口,而MaxOutOfOrderness适用于水印的所有使用(例如,处理功能)。
同时使用这两种机制非常有用,因为您可以使窗口在由水印定义的自然窗口结尾处触发,并在迟到事件到达时再次更新结果。
水印的目的是控制延迟和完整性之间的权衡。能够要求以低延迟(即,相对较短的MaxOutOfOrderness)产生结果,同时容纳很晚的事件,这很有用。
并且更正一件事:如果MaxOutOfOrderness为零并且存在AllowedLateness,那么您可能会有很多延迟事件(除非一切正常),但是只有当延迟超过时,它们才会被丢弃(通过窗口)允许的延迟。