这是我参与「第四届青训营 」笔记创作活动的第1天
-
window的原理
window将无限数据切割成有限的“数据块”进行处理,是处理无界流的核心。
根据时间把数据划分到对应的window中,按照时间语义,分为两种类型的时间:
- 事件时间:数据真实产生的时间,例如在用户在某个时间点进行了消费,一般作为一个属性嵌入到数据中。
- 处理时间:数据产生后到达机器的时间,相比与事件时间有一定的延迟。
通常是按照事件时间划分数据到对应的window中。window有起始时间和结束时间,程序根据watermark判断一个window是否要关闭,当watermark大于结束时间就触发这个window,对window内的数据进行聚合计算(例如求和),发到下游任务,并关闭该window。
注:watermark是衡量事件时间进展的标记,由数据的事件时间动态更新。
例如下图中第一个window起始时间和结束时间是0和10,则在这个时间段内的数据会被划分到这个window中。
处理迟到数据,即乱序数据,数据的时间戳不是单调递增的(中级功能中要求支持有限乱序数据) ,例如下图中第一次出现11时,watermark就被更新为11,此时第一个window会被关闭,当再次读到数据9时,该数据为迟到数据,会被丢弃。为了处理迟到数据,可以设置延迟时间,即当到达结束时间时,window再等一段时间才关闭,这样能减少迟到的数据被丢失。例如下图中设置延迟时间为2s,因此当读到数据11时,并不会关闭window,读到数据12的时候才会关闭,此时迟到的数据9就不会被丢失。
-
window的分类
- 滚动窗口:对数据进行均匀切片,窗口之间没有重叠,也就是说数据最多只落入一个窗口里面。最普遍的一种窗口,只有一个参数window_size,例如5分钟、1小时。。
- 滑动窗口:比滚动窗口多了一个参数步长window slide,表示多久滑动一次,此时window的计算频率由滑动步长决定,滑动一次就触发一次计算,窗口的大小决定了计算数据的范围。滚动窗口是特殊的滑动窗口,其滑动步长为窗口大小。
- 会话窗口:参数为超时时间session gap,如果相邻两个数据的时间间隔大于session gap,就关闭之前的窗口,新开一个窗口,因此,有些窗口的数据可能很多,因为在那个时间点连续不断地有数据进来,这些数据都属于同一个窗口。会话窗口在处理乱序数据的时候很麻烦,还涉及到多个窗口的数据合并。
-
window API的调用
一般先做keyBy按照key对数据分区然后再进行window聚合,相同key内做window聚合,例如上面的user1、user2、user3分别为3个不同的key。window选择窗口类型(滚动、滑动、会话),aggregate选择窗口内的聚合操作(求和、最大。)。