flink批处理-水位线
Flink中的水位线(Watermark)是一种用于处理事件时间(Event Time)语义下乱序数据流的机制,其核心是通过插入带有时间戳的特殊标记来跟踪事件时间的进展。以下是其关键特性与作用:
基本定义
水位线是嵌入数据流中的时间戳标记,表示“所有时间戳小于等于该值的事件理论上已到达系统”,用于推动逻辑时钟前进。例如,水位线T=5s
意味着事件时间≤5秒的数据应已完整到达。
核心功能
- 乱序数据处理:通过设置最大乱序容忍度(如
MaxOutOfOrderness
),允许延迟数据被正确分配到对应窗口。例如,水位线=最大事件时间-延迟阈值,确保窗口不会过早关闭。 - 窗口触发机制:当水位线超过窗口结束时间时触发计算,即使存在延迟数据。对于迟到数据,Flink提供侧输出流(Side Output)进行特殊处理。
注:假设滚动窗口大小为10,水位线最大乱序容忍度为5s。当事件时间为10s的数据到来时,水位线(不一定会插入当前水位线的值)=10s-5s = 5s。不触发计算。当事件事件为15s的数据到来时,水位线=15s-5s=10s。触发0s-9s的窗口计算。10s-15s的数据进入到下一个窗口(10s-19s的窗口),当事件时间为20s的数据到来的时候才触发计算。
生成策略
- 周期性生成:按固定时间间隔(如每秒)提取当前最大事件时间生成水位线。
- 断点式生成:基于特定事件(如数据中的标记字段)动态生成。
- 空闲分区处理:通过
IdleTimeout
避免空闲输入源拖慢全局水位线进度。