Flink 基础概念 —— 窗口
时间概念
事件时间、处理时间与进入时间(进入处理系统的时间)。
有些程序(如预警程序)允许小的误差(事件迟到),并且希望尽快得到结果,考虑使用处理时间语义。
欺诈检测系统或账单系统对准确性要求高,只有在时间窗口内发生的事件才能被算进来,考虑使用事件时间语义。
窗口
1.时间窗口
时间窗口是最简单和最有用的一种窗口。它支持滚动 Tumbling 与滑动 Sliding。
2.计数窗口
3.会话窗口
会话指的是活动阶段,其前后都是非活动阶段,例如用户与网站进行一系列 交互(活动阶段)之后,关闭浏览器或者不再交互(非活动阶段)。会话需要有自己的处理机制,因为它们通常没有固定的持续时间(有些 30 秒就结 束了,有些则长达一小时),或者没有固定的交互次数(有些可能是 3 次点击后购买,另一些可能是 40 次点击却没有购买)。flink 中会话由超时间设定,即希望多久才认为会话已结束。
窗口组件
1.WindowAssigner
为数据分配窗口。assignWindows
方法定义返回的结果是一个集合,数据可以被分配到多个窗口中。
public abstract Collection<W> assignWindows(T element, long timestamp, WindowAssignerContext context);
内置 WindowAssigner
Assigner | 说明 |
---|---|
GlobalWindows | 所有数据都分配到同一个窗口(GlobalWindow) |
TumblingProcessingTimeWindows | 基于处理时间的滚动窗口分配处理 |
TumblingEventTimeWindows | 基于事件时间的滚动窗口分配处理 |
SlidingEventTimeWindows | 基于事件时间的滑动窗口分配处理 |
SlidingProcessingTimeWindows | 基于处理时间的滑动窗口分配处理 |
MergingWindowAssigner | 一个抽象类,本身是一个WindowAssigner。内部定义了Window可以Merge的特性。 |
EventTimeSessionWindows | 基于事件时间可Merge的窗口分配处理 |
ProcessingTimeSessionWindows | 基于处理时间可Merge的窗口分配处理 |
2.Trigger
定时何时聚合数据。每一个默认窗口都有触发器。
触发器定义了3个触发动作,并且定义了触发动作处理完毕后的返回结果。返回结果交给Window Operator后由Window Operator决定后续操作。也就是说,Trigger通过具体的动作处理结果决定窗口是否应该被处理、被清除、被处理+清除、还是什么都不做。
/** Trigger关键接口定义 */ public abstract class Trigger<T, W extends Window> implements Serializable { /*** 新的数据进入窗口时触发 ***/ public abstract TriggerResult onElement(T element, long timestamp, W window, TriggerContext ctx) throws Exception; /*** 处理时间计数器触发 ***/ public abstract TriggerResult onProcessingTime(long time, W window, TriggerContext ctx) throws Exception; /*** 事件时间计数器触发 ***/ public abstract TriggerResult onEventTime(long time, W window, TriggerContext ctx) throws Exception; }
TriggerResult返回类型及说明
public enum TriggerResult { CONTINUE,FIRE,PURGE,FIRE_AND_PURGE; }
返回类型 | 说明 |
---|---|
CONTINUE | 不做任何操作 |
FIRE | 处理窗口数据,窗口计算后不做清理。这意味着下次FIRE时候可以再次用来计算(比如滑动计数窗口)。 |
PURGE | 移除窗口和窗口中的数据 |
FIRE_AND_PURGE | FIRE+PURGE的组合处理,即处理并移除窗口中的数据 |
内置触发器
触发器 | 说明 |
---|---|
EventTimeTrigger | 基于事件时间/摄取时间的触发器实现 |
ProcessingTimeTrigger | 基于处理时间的触发器实现 |
CountTrigger | 计数 |
DeltaTrigger | 计算上一个触发点与当前点,达到给定阈值触发 |
PurgingTrigger | 为触发器增加 purging 清理 |
NeverTrigger | GlobalWindows提供,每个触发逻辑不执行任何处理 |
ContinuousEventTimeTrigger | 根据设置的时间间隔连续触发,时间间隔依赖于水印时间戳 |
ContinuousProcessingTimeTrigger | 根据设置的时间间隔连续触发,时间间隔依赖于运行程序所在机器系统时钟 |
3.Evictor
Evictor驱逐者,如果定义了Evictor,当执行窗口处理前会删除窗口内指定数据再交给窗口处理,或等窗口执行处理后再删除窗口中指定数据。
public interface Evictor<T, W extends Window> extends Serializable { /** 在窗口处理前删除数据 */ void evictBefore(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext); /** 在窗口处理后删除数据 */ void evictAfter(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext); }
内置 evictor
Evictor | 说明 |
---|---|
CountEvictor | 可以保持窗口中一定数量的事件数据。在滑动计数窗口中实现evictBefore方法,以保持窗口中存在最近N次事件,从而达到了滑动效果。 |
TimeEvictor | 可以让元素在窗口中存在一定的时间,较老的数据会被删除。 |
DeltaEvictor | 根据DeltaFunction实现和阀值决定如何清理数据 |
233