时间语义与Wartermark
- 时间语义
- 乱序数据的处理
- 水位线(Watermark)
时间语义
Event Time:事件创建的时间
Ingestion Time:数据进入Flink的时间
Processing Time: 执行操作算子的本地系统时间,与机器相关
在代码中设置EventTime
//从调用时刻开始给env创建的每一个stream追加时间特征
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
乱序数据的处理
当Flink以Evnent Time模式处理数据流时,它会根据数据里的时间戳来处理基于时间点的算子;
由于网络、分布式等原因,会导致乱序数据的产生;
乱序数据会让窗口计算不准确
水位线(Watermark)
遇到一个时间戳达到了窗口关闭时间,不应该立刻除法窗口计算,而是等待一段时间,等迟到的数据来了在关闭窗口
Watermark是一种衡量Event Time进展的机制,可以设定延迟触发;
Watermark是用于处理乱序事件的,而正确的处理乱序事件,通常用Watermark机制结合window来实现;
1、watermark就是事件时间,代表当前时间的进展
2、watermark主要用来处理乱序数据,一般就是直接定义一个延迟时间,延迟触发窗口操作;这里的延迟,指的是当前收到的数据内的时间戳
3、watermark延迟时间的设置,一般要根据数据的乱序情况来定,通常设置成最大乱序程序度。如果要权衡正确性和实时性的话,可以不按最大乱序程度,而是给一个相对较小的watermark延迟。watermark延迟时间,完全是自己手动设置。
4、关窗操作,必须是时间进展到窗口关闭时间,事件时间语义下就是watermark达到窗口关闭时间
5、watermark代表的含义是,之后就不会再来时间戳比watermark里面的数值小的数据了;如果不同的上游分区,当前任务会对它们创建各自分区watermark,当前任务的事件时间就是最小的那个
6、处理乱序数据,Flink有三重保证
watermark可以设置延迟时间
window的allowedLateness方法,可以设置窗口允许处理迟到数据的时间
window的sideOutputLateData方法,可以将迟到的数据写入侧输出流
窗口有两个重要操作:触发计算,晴空状态(关闭窗口)
watermark的特点
watermark是一条特殊的数据记录
watermark必须单调递增,以确保任务的时间时间时钟在向前推进,而不是在后退
watermark与数据的时间戳相关
watermark的传递
watermark = maxTimeStamp - laterTime
注:maxTimeStamp:当前时间戳最大的时间。laterTime:延迟时间
数据比较稀疏时用断点式,数据比较密集用周期性