Flink Watermark 机制
所属分类 flink
浏览量 918
Watermark 水印 水位
窗口
周期性的获取数据 数据流切分成多个buckets
所有计算都在单一的buckets中进行
窗口(window)是从 Streaming 到 Batch 的一个桥梁
乱序/延迟 解决
Watermark / allowLateNess / sideOutPut 组合拳
Watermark 防止 数据乱序/延迟 指定时间内获取不到全部数据
allowLateNess 将窗口关闭时间延迟一段时间
sideOutPut 最后兜底操作,当指定窗口彻底关闭后,把所有过期延迟数据放到旁路输出流,让用户决定如何处理
Windows --> Watermark --> allowLateNess --> sideOutPut
用Windows把流数据切分处理
用Watermark确定什么时候不再等待更早的数据 触发窗口计算
用allowLateNess 将窗口关闭时间再延迟一段时间
用sideOutPut 最后兜底把延迟数据写到其他地方
Watermarks 基于已经收集的消息来估算是否还有消息未到达
本质上是一个时间戳 ,时间戳反映的是事件时间,而不是处理时间
Watermark 作为数据流的一部分随数据流流动
接收到Watermarks时,表示早于该时间的消息已经完全到达擎,不会再有时间小于水位线的事件到达
这个假设是触发窗口计算的基础,只有水位线越过窗口对应的结束时间,窗口才会关闭和进行计算
public final class Watermark extends StreamElement {
public static final Watermark MAX_WATERMARK = new Watermark(Long.MAX_VALUE);
// The timestamp of the watermark in milliseconds.
private final long timestamp;
乱序(out-of-order)
late element
延迟 消息积压 重试等
Window是处理无界流的关键,将流拆分成有限大小的buckets,在每一个buckets中进行计算
start_time,end_time
每个window都会有一个开始时间和结束时间 ,这个时间是系统时间
只要属于此窗口的第一个元素到达,就会创建一个窗口
当时间(事件或处理时间)超过其结束时间加上用户指定的允许延迟,窗口会被完全删除
Window Assigner
决定某个元素被分配到哪个/哪些窗口中去
Trigger
决定一个窗口何时能够被计算或清除
触发策略可能类似于
当窗口中的元素数量大于7
当水位线通过窗口结束时
Evictor
在 触发器触发后 & 应用函数之前或之后 从窗口中删除元素
窗口还拥有函数
比如 ProcessWindowFunction ReduceFunction AggregateFunction FoldFunction
窗口分类
Tumbling Window 无重叠
Sliding Window 有重叠
会话窗口 Session Window
次数窗口
窗口 大小10分钟 滑动大小为5分钟
每5分钟生成一个窗口,包含最后10分钟内到达的事件
事件时间(Event Time)
提取时间(Ingestion Time)
处理时间(Processing Time)
事件时间必须指定如何生成事件时间的Watermarks,表示事件时间进度的机制
每条数据都需要分配事件时间戳
设定时间特性
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
KeyedStream.timeWindow(Time.seconds(30))
Punctuated Watermark
Periodic Watermark
窗口关闭后,迟到事件到达的 处理方法有3种
重新激活已经关闭的窗口并重新计算以修正结果
将迟到事件收集起来另外处理
直接丢弃
Flink 默认的处理方式是 直接丢弃
其他两种方式分别使用Side Output和Allowed Lateness
Side Output
Allowed Lateness机制允许设置允许的最大迟到时长
Flink 会在窗口关闭后一直保存窗口的状态直至超过允许迟到时长
期间迟到事件不会被丢弃,而是默认会触发窗口重新计算
AssignerWithPeriodicWatermarks
BoundedOutOfOrdernessTimestampExtractor
内置的允许乱序最大延时的watermark生成方式,重写extractTimestamp方法
org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
public abstract long extractTimestamp(T element);
上一篇
下一篇
BigDecimal 使用注意点
小巧的Java编译器 Janino
Flink 知识点汇总
Spark核心设计思想
spark 原理及特点
spark运行模式及集群角色