按键分区和非按键分区对窗口计算的影响
本文重点
如果我们要开启窗口计算,需要确定数据流是否按键分区,因为是否对数据流进行按键分区对窗口的计算是存在不同程度的影响的。
区别
按键分区基础上定义窗口
经过按键分区keyBy操作后,DataStream会转换为KeyedStream。此时数据流会按照key被分为多条逻辑流(N个key就会有N个逻辑流),如果此时下游有多个子任务,可以并行执行。此时进行窗口操作时,每个逻辑流上都定义了一组窗口,各自独立地进行统计计算,不同key之间相互隔离不受影响。
API:
stram.keyBy().window()
非按键分区基础上定义窗口
如果没有进行 keyBy分区,那么就相当于直接在DataStream 调用.windowAll()定义窗口。
此时没有进行分区,就不会有多个逻辑流,窗口只会在一条流上进行计算,就相当于并行度变成了1,此时计算手动调大窗口算子的并行度也是无效的, windowAll 本身就是一个非并行的操作,所以在实际应用中一般不推荐使用这种方式。
API:
stream.windowAll(...)