flink window机制 原理/踩坑 持续更新

本文用于更新window机制相关内容,长期保持更新(细数踩过的坑)

1.flink window 时间机制

flink 时间window靠的是timestamp,不管是event time还是process time
我们都知道flink window开启一个时间的窗口用于接收数据,如事件时间
flink window 开启一定范围的窗口,ts1 to ts2 左闭右开
当数据的时间戳超过watermark( ts - delay >= ts2),该窗口计算关闭,开启下一个窗口(如果窗口大小是一分钟,ts 比ts2大一年,也是开启一个新窗口来计算该ts,中间是没有其他窗口的,虽然超过一年)
但是ts1和ts2到底是多少呢?也就是窗口开始和结束时间到底是怎么样的?

在org.apache.flink.streaming.api.windowing.windows.TimeWindow.java中有个方法

public static long getWindowStartWithOffset(long timestamp, long offset, long windowSize) {
        return timestamp - (timestamp - offset + windowSize) % windowSize;
}

看名字就知道getWindowStartWithOffset,获取window开始的偏移量,那就是开始时间咯
startTime=timestamp - (timestamp - offset + windowSize) % windowSize
offset是时区偏移量windowSize%windowSize=0
所以上述公式可以转换为
startTime=timestamp - timestamp % windowSize
举个例子
最开始有条数据入窗口,时间戳是1661097226000对应北京时间2022-8-21 23:53:46
如果windowSize是1min,也就是60000
startTime = 1661097226000- 1661097226000% 60000
startTime = 1661097226000-46000=1661097180000=北京时间2022-8-21 23:53:00

也就是1min窗口,会从第一条数据的事件时间的分钟头开始计算,例如23:53:46 window开始时间为23:53:00,结束时间为23:54:00

同样,秒级窗口也一样23:53:46:123 窗口开始时间为23:53:46,结束时间为23:53:47(23:53:46+windowSize秒)

机制下可能造成的数据错乱问题

那么问题来了,flink该方法时间戳与window毫秒级数值进行运算,如果你的时间戳10(秒级别),会造成数据错乱,例如5秒窗口
1661097226 - 1661097226%5000 =1661097226 - 2226=1661095000 对应北京时间2022-8-21 23:16:40,(芜湖起飞,数据错乱,所以你遇到10位时间戳需要补000,血与泪的教训)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值