一、简介
我们基于特定时间段进行聚合时,可以引用不同的时间类型,Flink 最新版本提供了Event Time、Processing Time 两种时间类型。数据在Flink 流转时,有时因为网络、资源等,产生一些乱序,获取到时间乱序,为了统计数据更准确,Flink 提供了水位线WaterMark 来跟踪Event Time。
二、watermark介绍
数据在Flink流转过程中,产生一些乱序,获取到时间乱序,如图所示:
官方图片
Flink 窗口为了统计数据更准确,提供watermark机制,我们不可能无限等待下去,允许为窗口操作符指定最大允许延迟。assignTimestampsAndWatermarks 指定元素在窗口关闭之前可以延迟多少时间,其默认值为 0。采用允许延迟,把那些乱序、延迟数据也统计进去,提高数据的准确性
三、watermark+window 介绍
我们采用滚动窗口(Tumbling Windows)+watermark(水位线)来举例子说明,这样对更清晰认识到水位线的作用
1、数据产生乱序时,指定一个大小为 5 分钟的滚动窗口
{"key":"002","time":1642263310000}
{"key":"002","time":1642263311000}
{"key":"002","time":1642263315000}
{"key":"002","time":1642263313000}
(002,2,1642263310000,1642263315000,1642263314999)
说明:在[window_start_time,window_end_time)中有数据存在只有两条,第一条数据与第三条数据相差5秒,触发窗口,后面第4条数据没计算进去,因为延迟了,这样统计结果不是很准确
1642263310000->窗口开始时间
1642263315000->窗口关闭时间
1642263314999->水位线,默认设置为0
2、数据产生乱序时,指定一个大小为 5 分钟的滚动窗口+水位线(2秒)
{"key":"002","time":1642263310000}
{"key":"002","time":1642263311000}
{"key":"002","time":1642263315000}
{"key":"002","time":1642263313000}
{"key":"002","time":1642263317000}
(002,3,1642263310000,1642263315000,1642263314999)
{"key":"002","time":1642263320000}
{"key":"002","time":1642263318000}
{"key":"002","time":1642263322000}
(002,3,1642263315000,1642263320000,1642263319999)
说明:
1)watermark时间 >= window_end_time
2)在[window_start_time,window_end_time)中有数据存在
第一条数据与第三条数据相差5秒,还没触发窗口,设置延迟2秒,水位线是1642263313000,还没达到条件
第一条数据与第五条数据相差7秒,水位线是1642263315000,触发窗口