FLINK:水位线的介绍

本文重点

在前面的一节课程中我们学习了时间语义,其中有一个关键问题:

分布式的Flink如何保证时间的统一?

系统时间肯定是无法保证的,一定会有偏差,此时Flink引入了水位线的概念,水位线类似于一个逻辑时间,它依赖流中数据的事件事件来推动,从而保证分布式中每个节点都可以保证事件的统一,本文对此进行学习。

节点的时间

假设:单任务执行。数据都是顺序到达的,就是说时间1产生的数据一定比时间2到达的节点早,这是一种非常理想的情况。

在前面窗口课程中,我们介绍了一个温度传感器的例子。那么窗口是如何来进行时间计算的呢?换句话来说,flink怎么知道窗口[0,10)结束了,是时候开启下面一个窗口[10,20)?

总不能是设定一个开始值,然后各个节点的系统时间开始计时,10分钟后就关闭[0,10),然后开启[10,20)?

此时会有两个问题,一个是分布式节点之间如何校时?另一个是数据由于网络传输慢导致错过窗口的问题?

Flink此时根据数据的事件时间来计算当前时间,而不是系统的节点时间,举例来说:

当数据1到达的时候,Flink设定当前的时间为1。

当数据9到达的时候,Flink设定当前的时间为9。

当数据10到达的时候,Flink设

Flink SQL中的水位线(Watermark)是一种时间概念,主要用于处理流式数据的事件时间窗口计算。在Apache Flink这样的实时流处理框架中,由于数据的不可预测性和乱序到达,传统的基于点时间(point in time)的处理可能会导致结果不准确。水位线的概念引入了事件的时间依赖性,用于解决这个问题。 简单来说,水位线定义了一个“事件发生应该被处理”的时间范围。对于每个事件,系统会有一个与其关联的水位线,表示该事件发生后允许的最大延迟时间。如果后续的事件晚于这个水位线,那么就认为这些事件已经被处理过了;反之,如果新的事件早于水位线,系统则需要重新考虑之前的状态和计算。 Flink SQL的水位线设置涉及到两个关键参数: 1. **事件时间**(event time):这是相对于实际事件发生的绝对时间。 2. **滑动时间窗口**(sliding window):例如Tumbling Window或Sliding Window,用来定义事件何时进入和离开窗口。 - **事件时间戳**:每条消息都有其生成的时间戳,这是计算水位线的基础。 - **事件时间水印**:根据已接收的消息计算出来的未来可能到达的最新消息时间点。 - **处理时间水印**:基于消息实际到达时间计算的水位线Flink提供了API来调整水位线策略,如EventTimeSessionWindows中的timeBeforeEvent、timeAfterEvent等方法,用于设定水位线的具体行为。通过合理的水位线配置,Flink能够保证即使在数据乱序的情况下,也能正确地处理事件时间窗口内的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

每天五分钟玩转人工智能

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值