10分钟了解Flink Watermark水印

本文详细解释了Flink中Watermark的概念,如何处理数据延迟,包括水印的计算、允许的最大延迟时间、侧道输出机制以及不同类型的水印策略。通过实例展示了如何在Flink程序中应用这些概念来确保正确处理乱序数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇中,介绍了Flink里时间的概念和窗口计算,在实际生产过程中,由于网络等原因,许多数据会延迟到达窗口,这种情况Flink如何处理?Watermark登场,本文从这几点进行介绍:水印的概念、水印如何计算、允许延迟和侧道输出、水印生成策略、案例及代码。

1、一个小例子

讲解概念前,我先举个例子。比如工厂的生产线有一批货物要发出,每个货物上都有一个生产时间的标记,司机在门口等待货物,他每天9:00出发,只要他看到最新过来的货物上的时间是9:00,那他立马就出发。

但是久而久之他发现,有些货物会延迟到达,比如9:00的货物已经到达,忽然他又看到一个8:59的货物到达了,为了能够一次性运送更多的货物,他决定继续多等5分钟,即:如果9:05的货物到达后,他就立马出发,不再等待了。

这样的话,即使有延迟到达的货物,只要它们能在9:05分之前到达,那这部分货物也会被发出。

2、水印的概念

我们来思考一个场景,比如,对于窗口[12:00-12:10),事件时间为12:04的数据,由于网络原因,到达Flink的时间是12:11。此时窗口已经关闭了,该数据将不属于任何窗口,最终这个数据会丢失。

所以,为了保证计算结果的正确性,需要让窗口等待延迟数据到达后再进行计算,但是也不能无限期地等待下去,必须有一种机制来确定何时触发窗口计算,这种机制就是水印(Watermark)。

水印是一种用于衡量事件时间进度的机制,其表示某个时刻(事件时间)以前的数据将不再产生,因此水印指的是一个时间点。水印作为数据流的一部分流动,并带有时间戳t。t表示该流中不应再有时间戳小于等于t的元素(即时间戳早于或等于水印的事件)。

如下图,显示了带有时间戳和嵌入式水印的事件流,事件是按顺序排列的,这意味着水印只是流中的周期性标记。

水印对于乱序流至关重要,如下图,其中事件不是按其时间戳排序的。通常,水印是数据流中一个点的声明,表示水印之前的所有事件都应该到达。一旦水印到达,算子则认为某个时间周期内的所有事件已经被收到,不会再有更多符合条件的事件了。

3、水印如何计算

计算水印需要提前指定一个允许最大延迟时间的参数。

水印 = 进入Flink的当前最大事件时间(比如上面例子中的9:05分到达的货物) ‒ 允许最大延迟时间(比如上面例子中的司机多等待的5分钟)

当水印 >= 窗口结束时间时,立即触发窗口计算,计算完毕后发射出计算结果并销毁窗口,否则窗口将一直等待。

所以,窗口触发计算的规则是:进入Flink的当前最大事件时间 >= 窗口结束时间+允许最大延迟时间。可见,设置水印后会改变窗口的触发计算规则。

例子:假

在Apache Flink中,水印Watermark)是一种用于处理事件时间(Event Time)流式数据的时间概念,用于表征事件时间的进展。水印Flink处理乱序事件流时,衡量事件时间进度的一种机制。它允许Flink在不确定数据完整性的前提下,对事件进行处理和分析。 水印通常定义为一个带时间戳的特殊数据元素,当流中的水印到达某个特定的算子时,它告诉该算子当前处理进度的最大事件时间。如果一个算子收到了所有事件时间小于或等于当前水印时间戳的事件,那么该算子可以安全地认为从时间戳最小的事件到水印时间戳之间的所有事件都已经被处理过了。 定义水印的常见方法有以下几种: 1. 固定延迟水印:在事件时间戳的基础上添加一个固定的延迟时间。例如,如果事件的最大可能延迟是2秒,水印可以定义为 `Watermark = currentMaxEventTimestamp - 2s`。 2. 自定义逻辑水印:根据特定的逻辑来生成水印。例如,可以在流中监控事件的到达模式,并据此生成水印。 3. 无水印:某些情况下,如果不需要考虑事件乱序或者有其他机制保证事件顺序,则可以不定义水印。 在Flink代码中,可以使用WatermarkStrategy来定义水印策略。例如: ```java WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(2)) ``` 上述代码表示定义了一个水印策略,该策略会在事件时间戳的基础上添加2秒的固定延迟作为水印
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员半支烟

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值