一、时间类型
- 事件时间:指时间发生的时间,一旦确定之后再也不会改变。
- 处理时间:指消息被计算引擎处理的时间,以各个计算节点的本地时间为准。
- 摄取时间:指事件进去流处理系统的时间,对于一个事件来说,使用其被读取的那一刻时间戳。
二、窗口
2.1 窗口类型
- Count Window(计算窗口)
1)Tumble Count Window:累积固定个数的元素就视为一个窗口,该类型的窗口无法像时间窗口一样事先切分好。
2)Sliding Count Window:累积固定个数的元素视为一个窗口,每超过一定个数的元素,则产生一个新的窗口。
- Time Window(时间窗口)
1)Tumble Time Window:表示在时间上按照事先约定的窗口大小切分的窗口,窗口之间不会相互重叠。
关键属性有两个:
1.Offset:窗口的起始时间。
2.Size:窗口的长度。
2)Sliding Time Window:表示在时间上按照事先约定的窗口大小、滑动步长切分的窗口,滑动窗口之间可能存在相互重叠的情况。
关键属性有三个:
1.Offset:窗口的起始时间。
2.Size:窗口的长度。
3.Slide:滑动距离。
- Session Window(会话窗口)
是一种特殊的窗口,当超过一段时间,该窗口没有收到新的数据元素,则视为该窗口结束,所以无法事先确定窗口的长度、元素个数,窗口之间也不会相互重叠。
Session Window的4种实现:
1)ProcessingTimeSessionWindows:处理时间会话窗口,使用固定会话间隔时长。
2)DynamicProcessingTimeSessionWindows:处理时间会话窗口,使用自定义会话间隔时长。
3)EventTimeSessionWindows:事件时间会话窗口,使用固定会话间隔时长。
4)DynamicEventTimeSessionWindows:事件时间会话窗口,使用自定义会话间隔时长。
会话窗口不同于事件窗口,它的切分依赖于事件的行为,而不是时间序列,所以在很多情况下会因为事件乱序使得原本相互独立的窗口因为新事件的到来导致窗口重叠,而必须要进行窗口的合并。
窗口合并涉及3个要素:
1)窗口对象合并和清理
2)窗口State的合并和清理
3)窗口触发器的合并和清理
会话窗口合并逻辑图:
2.2 窗口原理与机制
窗口算子负责处理窗口,数据流源源不断进入算子,每一个数据元素进入算子时,首先会被交给WindowAssigner。WindowAssigner决定元素被放到哪个或哪些窗口,在这个过程中可能会创建新窗口或者合并旧的窗口。在Window Operator中可能同时存在多个窗口,一个元素可以被放入多个窗口中。
数据进入窗口时,分配窗口和计算的逻辑图如下:
2.3 WindowAssigner
WindowAssigner用来决定某个元素被分配到哪个/哪些窗口中去。SessionWindowAssigner比较特殊,因为Session Window无法事先确定窗口的范围,是动态改变的。
2.4 WindowTrigger
Trigger触发器决定了一个窗口何时能够被计算或清除,每一个窗口都拥有一个属于自己的Trigger,Trigger上会有定时器,用来决定一个窗口何时能够被计算或清除。每当有元素加入该窗口,或者之前注册的定时器超时时,Trigger都会被调用。
Trigger触发的结果如下:
1)Continue:继续,不做任务操作。
2)Fire:触发计算,处理窗口数据。
3)Purge:触发清理,移除窗口和窗口中的数据。
4)Fire + Purge:触发计算+清理,处理数据并移除窗口和窗口中的数据。
当数据到来时,调用Trigger判断是否需要触发计算,如果调用结果只是Fire,则计算窗口并保留窗口原样,窗口中的数据不清理,数据保持不变,等待下次触发计算的时候再次执行计算。窗口中的数据会被反复计算,直到触发结果清理。在清理之前,窗口和数据不会释放,所以窗口会一直占用内存。
2.5 WindowEvictor
Evictor 可以理解为窗口数据的过滤器,Evictor可在Window Function执行前或后,从Window中过滤元素。Flink内置了3种窗口数据过滤器。
- CountEvictor:计数过滤器。在Window中保留指定数量的元素,并从窗口头部开始丢弃其余元素。
- DeltaEvictor:阈值过滤器。本质上来说是一个自定义规则,计算窗口中每个数据记录,然后与一个事先定义好的阈值做比较,丢弃超过阈值的数据记录。
- TimeEvictor:时间过滤器。保留Window中最近一段时间内的元素,并丢弃其余元素。