流式计算中的Window机制
Window 是什么
在流计算中,数据流是持续不断的,因此不可能等全部数据都到了再开始处理。Window的作用就是将无限的Streaming拆分成大小有限的Batch,我们可以对每个Window里的数据进行应用和计算。
典型Window的基本功能
本文介绍 滚动窗口 、滑动窗口 和 会话窗口
Tumble Window(滚动窗口)
滚动窗口特点:
窗口不重叠,每个数据只能属于一个窗口
窗口长度固定
当时间大于等于Window end时,一次性触发对应的Window的输出
Sliding Window(滑动窗口)
滚动窗口特点:
滑动窗口以一个步长不断向前滑动,窗口的长度固定。
窗口可能重叠
当窗口长度大于滑动窗口的步长,数据就可能属于多个窗口
当窗口长度小于滑动窗口的步长,数据就可能不属于任何窗口
当时间大于等于Window end时,一次性触发对应的Window的输出
Session Window(会话窗口)
session gap 指 各个session之间的间隔,一般会设置一个会话的最大gap,比如1分钟,当session gap大于1分钟,数据就会被分到不同的session中。
窗口长度不等
当时间大于等于Window end时,一次性触发对应的Window的输出
迟到数据的处理
迟到的定义:watermark驱动某个窗口触发输出之后,这个窗口如果后面又来了数据,那这种情况就属于是迟到的数据了。
处理办法:
直接丢弃(默认)
设置一个允许迟到时间,这种情况下,窗口正常计算时间结束后不会马上清理数据,而是多保留一个“迟到时间”,如果这段时间内有数据到达,则继续计算
将迟到数据转变成一个单独的流,再由用户自己决定如何处理(侧输出流)
增量计算 和 全量计算
增量计算:每条数据到来后,直接参与计算,但是暂不输出结果
全量计算:每条数据到来后,先放到一个buffer中,这个buffer会存储到状态里,直到窗口触发输出的时候,才把所有数据拿出来统一进行计算
EMIT触发
背景:正常的窗口都是在窗口结束时才会进行输出,比如窗口时间为一天,只有在一天结束时才会输出结果,这时便失去了实时计算的意义。
作用:EMIT触发是一种可以提前把窗口内容输出的机制,比如窗口时间为一天的窗口,设置其5s输出一次,使下游更快的获得到窗口计算的结果。