关于flink watermark水位线的理解

本文章基于以下两个视频的一点理解:

https://www.bilibili.com/video/BV1qy4y1q728?p=51

https://www.bilibili.com/video/BV1qy4y1q728?p=52

假设以event-time作为时间,延迟2秒,窗口大小是5秒。

注意:flink可以同时存在两个窗口的数据在等待计算。

理解一:
1、时间戳1的数据到来,时间范围在[0,5)内,数据进入桶[0,5)
2、时间戳4的数据到来,时间范围在[0,5)内,数据进入桶[0,5)
3、时间戳5的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
      因为延迟是2秒,设置窗口[0,5)的水位线为7=5+2,桶[0,5)的数据还没触发计算。
4、时间戳2的数据到来,时间范围在[0,5)内而且没有大于或等于水位线7,数据进入桶[0,5)
5、时间戳3的数据到来,时间范围在[0,5)内而且没有大于或等于水位线7,数据进入桶[0,5)
6、时间戳6的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
7、时间戳7的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
     因为时间戳7不小于窗口[0,5)的水位线7,触发窗口[0,5)的计算
     后面再来时间戳在[0,5)的数据都会被丢掉
8、时间戳5的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
9、时间戳8的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
10、时间戳5的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
11、假设时间戳12的数据到来,时间范围在[10,15),数据进入桶[10,15)
       因为延迟是2秒,设置窗口[5,10)的水位线为14=12+2,桶[5,10)的数据还没触发计算
12、假设时间戳9的数据到来,时间范围在[5,10)内而且没有大于或等于水位线14,数据进入               桶[5,10)
13、假设时间戳10的数据到来,时间范围在[10,15),数据进入桶[10,15)
14、假设时间戳14的数据到来,时间范围在[10,15),数据进入桶[10,15)
        因为时间戳14不小于窗口[5,10)的数位线14,触发窗口[5,10)的计算
        后面再来时间戳在[5,10)的数据都会被丢掉
15、同理

理解二:
1、时间戳1的数据到来,时间范围在[0,5)内,数据进入桶[0,5)
2、时间戳4的数据到来,时间范围在[0,5)内,数据进入桶[0,5)
3、时间戳5的数据到来,时间范围在[5,10)内,数据进入桶[5,10)
     因为延迟是2秒,窗口[0,5)的数据会等待2秒再进行计算,在这2秒内如果还有时间戳在               [0,5)的数据则进入桶[0,5),譬如后面的2和3,6则进入桶[5,10)
4、2秒过后计算窗口[0,5)的数据
5、同理

理解三:这个理解最符合
watermark本质上是一个时间戳,且是动态变化的,会根据当前最大事件时间产生。watermarks具体计算为:
watermark = 进入 Flink 窗口的最大的事件时间(maxEventTime)减去指定的延迟时间(t)
当watermark时间戳大于等于窗口结束时间时,意味着窗口结束,需要触发窗口计算。


1、时间戳1的数据到来,watermark=1-2=-1,小于窗口[0,5)的5,数据进入桶[0,5)
2、时间戳4的数据到来,watermark=4-2=2,小于窗口[0,5)的5,数据进入桶[0,5)
3、时间戳5的数据到来,watermark=5-2=3,小于窗口[0,5)的5,数据进入桶[5,10)
4、时间戳2的数据到来,watermark=3不变,小于窗口[0,5)的5,数据进入桶[0,5)
5、时间戳3的数据到来,watermark=3不变,小于窗口[0,5)的5,数据进入桶[0,5)
6、时间戳6的数据到来,watermark=6-2=4,
     小于窗口[0,5)的5,小于窗口[5,10)的10,数据进入桶[5,10)
7、时间戳7的数据到来,watermark=7-2=5,
     不小于窗口[0,5)的5,触发窗口[0,5)的计算,小于窗口[5,10)的10,进入桶[5,10)
8、假设时间戳12的数据到来,watermark=12-2=10,
     不小于窗口[5,10)的10,触发窗口[5,10)的计算,数据进入桶[10,15)
9、同理

辅助理解文章:

https://blog.csdn.net/qq_31866793/article/details/104188697 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值