返回介绍

活动时间和水印

发布于 2025-05-02 18:19:13 字数 3318 浏览 0 评论 0 收藏

注意:Flink 实现了数据流模型中的许多技术。有关事件时间和水印的详细介绍,请查看以下文章。

支持 事件时间的 流处理器需要一种方法来衡量事件时间的进度。例如,当事件时间超过一小时结束时,需要通知构建每小时窗口的窗口算子,以便算子可以关闭正在进行的窗口。

事件时间 可以独立于 处理时间 (由挂钟测量)进行。例如,在一个程序中,算子的当前 事件时间 可能略微落后于 处理时间 (考虑到接收事件的延迟),而两者都以相同的速度进行。另一方面,通过快速转发已经在 Kafka 主题(或另一个消息队列)中缓冲的一些历史数据,另一个流程序可以通过几周的事件时间进行,只需几秒钟的处理。


Flink 中用于衡量事件时间进度的机制是 水印 。水印作为数据流的一部分流动并带有时间戳 t 。一个 水印(T) 宣布事件时间达到时间 吨 该流,这意味着应该有从该流没有更多的数据元与时间戳 T” <= T (即事件与水印时间戳旧的或相等)。

下图显示了具有(逻辑)时间戳的事件流,以及内联流水印。在该示例中,事件按顺序(关于它们的时间戳),意味着水印仅是流中的周期性标记。

包含事件(按顺序)和水印的数据流

水印对于 无序 流是至关重要的,如下所示,其中事件不按时间戳排序。通常,水印是一种声明,通过流中的该点,到达某个时间戳的所有事件都应该到达。一旦水印到达算子,算子就可以将其内部 事件时钟 提前到水印的值。

包含事件(乱序)和水印的数据流

请注意,事件时间由新生成的流数据元(或多个数据元)继承,这些数据元来自生成它们的事件或触发创建这些数据元的水印。

并行流中的水印

在源函数处或之后生成水印。源函数的每个并行子任务通常独立地生成其水印。这些水印定义了该特定并行源的事件时间。

当水印流过流处理节目时,它们会在他们到达的算子处推进事件时间。每当算子提前其事件时间时,它为其后继算子生成下游的新水印。

一些算子消耗多个输入流; 例如,一个 union,或者跟随 keyBy(...) 或 partition(...) 函数的 算子。这样的算子当前事件时间是其输入流的事件时间的最小值。由于其输入流更新其事件时间,因此算子也是如此。

下图显示了流经并行流的事件和水印的示例,以及跟踪事件时间的 算子。

具有事件和水印的并行数据流和 算子

请注意,Kafka 源支持每分区水印,您可以 在此处 详细了解。

迟到数据元

某些数据元可能违反水印条件,这意味着即使在 水印(t) 发生之后,也会出现更多具有时间戳 t'<= t 的 数据元。实际上,在许多现实世界设置中,某些数据元可以被任意延迟,从而无法指定某个事件时间戳的所有数据元将发生的时间。此外,即使迟到有限,通常也不希望将水印延迟太多,因为它在事件时间窗的评估中引起太多延迟。

出于这个原因,流程序可能明确地期望一些 后期 数据元。后期数据元是在系统的事件时间时间之后到达的数据元(由水印发出信号)已经超过了后期数据元的时间戳的时间。有关如何在事件时间窗口中使用延迟数据元的更多信息,请参阅 允许 延迟。

空闲 Sources

目前,对于纯事件时间水印生成器,如果没有要处理的数据元,则水印不能进行。这意味着在输入数据存在间隙的情况下,事件时间将不会进行,例如窗口算子将不会被触发,因此现有窗口将不能产生任何输出数据。

为了避免这种情况,可以使用定期水印分配器,它不仅基于数据元时间戳进行分配。示例解决方案可以是在不观察新事件一段时间之后切换到使用当前处理时间作为时间基础的分配器。

源可以标记为空闲使用 SourceFunction.SourceContext#markAsTemporarilyIdle 。有关详细信息,请参阅此方法的 Javadoc 以及 StreamStatus

调试水印

有关在运行时调试水印的信息,请参阅 调试 Windows 和事件时间 部分。

算子如何处理水印

作为一般规则,算子需要在向下游转发之前完全处理给定的水印。例如, WindowOperator 将首先评估应该触发哪些窗口,并且只有在产生由水印触发的所有输出之后,水印本身才会被发送到下游。换句话说,由于出现水印而产生的所有数据元将在水印之前发出。

同样的规则适用于 TwoInputStreamOperator 。但是,在这种情况下,算子的当前水印被定义为其两个输入的最小值。

这种行为的细节由的实现方式定义 OneInputStreamOperator#processWatermarkTwoInputStreamOperator#processWatermark1TwoInputStreamOperator#processWatermark2 方法。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。