Flink事件时间中的时间戳和水位线

事件时间中的时间戳和水位线

乱序流中生成的水位线的时间戳,其实是 当前数据中最大时间戳 – 延迟时间 – 1,这里的单位是毫秒。为什么要减 1 毫秒呢?
我们可以回想一下水位线的特点:时间戳为 t 的水位线,表示时间戳≤t 的数据全部到齐,不会再来了。假设数据中时间戳为 7 秒的
数据到来时,不能说≤7s 的数据全部到来了,之后其实是还有可能继续来数据中时间戳为 7 秒的数据啊,所以生成的水位线不是 7 秒,而是 6 秒 999 毫秒,这点可以在乱序流中定义时间戳策略相关类 BoundedOutOfOrdernessWatermarks 的源码中明显地看到:maxTimestamp 代表数据的最大时间戳,outOfOrdernessMillis 代表延迟时间,我们暂时考虑延迟为0

public void onPeriodicEmit(WatermarkOutput output) {
output.emitWatermark(new Watermark(maxTimestamp - outOfOrdernessMillis - 1));

明确事件时间中的水位线t代表什么,表示数据中的时间戳 ≤t的数据全部到齐,不会再来了
所以如果2000的数据到来 当前的水位线是1999 表示<=1999的数据不会再来了
对于窗口而言 如果我定义一个[1000~2000)的一个窗口,窗口内应该包含1000的数据,不包含2000的数据(左闭右开),那么这个窗口何时应该关闭呢

关闭的时刻应该是一个时间条件=另一个时间条件对吧 应该是满足一个关系(x=y)
x: 对于窗口[1000~2000)它不包含2000 那么给它定义窗内口中能够存在的最大的时间戳应该是2000-1=1999毫秒 可参考
TimeWindow中的一个 maxTimestamp()方法,用来获取窗口中能够包含数据的最大时间戳

public long maxTimestamp() {
return end - 1;
}

y: 对于水位线 2000时间戳的数据到来 当前的水位线是1999 表示<=1999的数据不会再来了
x=y:窗口中数据能够存在的最大的数据时间戳是1999,此刻水位线是1999 表示<=1999的数据不会再来了,所以此时当然可以关闭窗口了!

还有一点注意的是,Flink的定时器方法onTimer() 如果设置好定时时间之后,就必须等到水位线推进到指定时间才能触发
例如
定义一个5000的定时器,5000的时间戳数据到来后,200ms后时间戳变为4999,无法触发,当5001的数据到来后,200ms后就可以触发了

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值