Flink 基础概念 —— 窗口

时间概念

事件时间、处理时间与进入时间(进入处理系统的时间)。

有些程序(如预警程序)允许小的误差(事件迟到),并且希望尽快得到结果,考虑使用处理时间语义。

欺诈检测系统或账单系统对准确性要求高,只有在时间窗口内发生的事件才能被算进来,考虑使用事件时间语义。

 

窗口

1.时间窗口

时间窗口是最简单和最有用的一种窗口。它支持滚动 Tumbling 与滑动 Sliding。

 

2.计数窗口

 

3.会话窗口

会话指的是活动阶段,其前后都是非活动阶段,例如用户与网站进行一系列 交互(活动阶段)之后,关闭浏览器或者不再交互(非活动阶段)。会话需要有自己的处理机制,因为它们通常没有固定的持续时间(有些 30 秒就结 束了,有些则长达一小时),或者没有固定的交互次数(有些可能是 3 次点击后购买,另一些可能是 40 次点击却没有购买)。flink 中会话由超时间设定,即希望多久才认为会话已结束。

 

窗口组件

1.WindowAssigner

为数据分配窗口。assignWindows方法定义返回的结果是一个集合,数据可以被分配到多个窗口中。 

public abstract Collection 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 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 extends Serializable {
    /** 在窗口处理前删除数据 */
    void evictBefore(Iterable> elements, int size, W window, EvictorContext evictorContext);
    /** 在窗口处理后删除数据 */
    void evictAfter(Iterable> elements, int size, W window, EvictorContext evictorContext);
}

 

内置 evictor

Evictor 说明
CountEvictor 可以保持窗口中一定数量的事件数据。在滑动计数窗口中实现evictBefore方法,以保持窗口中存在最近N次事件,从而达到了滑动效果。
TimeEvictor 可以让元素在窗口中存在一定的时间,较老的数据会被删除。
DeltaEvictor 根据DeltaFunction实现和阀值决定如何清理数据

 

 

233

你可能感兴趣的:(Flink 基础概念 —— 窗口)