这是我参与「第四届青训营 」笔记创作活动的第7天
StreamWindow
WaterMark
由于并行计算必然导致不确定性、混沌性,网络传输的不可靠和不稳定性,因此引入waterMark机制
waterMark 允许一定程度的乱序,即数据在规定范围内迟到,允许继续参与运算,但是数据迟到时间超过等待范围,则丢弃
基本原理是用一个虚拟时间戳再加上允许浮动的数值范围来确定数据的可用性[这玩意不就是waterMark(水位标记)嘛...]
Window
window 分类
-
Tumble Window(滚动窗口)
每个数据的key单独划分
每条数据只会属于一个窗口
-
Sliding Window(滑动窗口)
每个数据的key单独划分
每条数据可能会属于多个窗口
-
Session Window(会话窗口)
每个数据的key单独划分
每条数据会单独划分为一个窗口,如果window之间有交集,则会队窗口进行merge(合并)
处理数据迟到
只有事件时间才会有迟到的数据,处理时间不会有迟到数据
-
Allow Lateness
设置一个允许迟到的时间,窗口正常计算结束后,不会马上清理状态,而是会多保留 allow lateness 那么长的时间,倘若这段时间内有数据到来,则继续之前的状态进行计算
适用:DataStream,SQL
-
Side Output(侧输出流)
这种方式会对迟到数据打一个tag,然后 data stream 上根据这个 tag 获取迟到数据流,由业务层自行选择处理
适用:DataStream
增量计算与全量计算
-
增量计算
- 每条数据到来,直接进行计算,window只存储计算结果。比如计算sum,状态中只需要存储sum的结果,不需要保存每条数据
- 典型的reduce、aggregate等函数都是增量计算
- SQL中的聚合只有增量计算
-
全量计算
- 每条数据到来,会存储到window的state中。等到 window触发计算的时候,将所有数据拿出来一起计算。
- 典型的process函数就是全量计算
EMIT 触发
通常来讲,window都是在结束的时候才能输出结果,比如1h的tumble window,只有在1个小时结束的时候才能统一输出结果
如果窗口比较大,比如1h或者1天,甚至于更大的话那计算结果输出的延迟就比较高,失去了实时计算的意义
EMIT 输出指的是,在window没有结束的时候,提前把 window计算的部分结果输出出来