这是我参与「第四届青训营 」笔记创作活动的第5天。
流式计算中的 Window 计算
三种常见的Window 基本功能: TUMBLE Window (滚动窗口)、HOP Window (滑动窗口)和SESSION Window (会话窗口)
TUMBLE Window (滚动窗口) 这是最常见的窗口类型,就是根据数据的时间(可以是处理时间,也可以是事件时间)划分到它所属的窗口中。
HOP Window (滑动窗口) 了解了TUMBLE窗口的基本原理后,HOP窗口就容易理解了。上面的TUMBLE窗口是每条数据只会落在一个窗口中。在HOP窗口中,每条数据是可能会属于多个窗口的(具体属于多少,取决于窗口定义的大小和滑动)。
SESSION Window (会话窗口)
会话窗口跟上面两种窗口区别比较大,上面两个窗口的划分,都是根据当前数据的时间就可以直接确定它所属的窗口。会话窗口的话,是一个动态merge的过程。一般会设置一个会话的最大的gap,eg:10min。
所以会话窗口要求所有的聚合函数都必须有实现merge。
Window 高级优化(只限于在SQL中的window中才有)
-
Mini-batch 这个优化主要是适用于没有窗口的聚合场景,即赞一小批数据再进行计算,这批数据每个key的state访问只有一次,这样在单个key的数据比较集中的情况下,对于状态访问可以有效的降低频率,最终提升性能。
-
Local-global local-global优化是分布式系统中典型的优化,主要是可以降低数据shuffle的量,同时也可以缓解数据的倾斜。 所谓的local-global,就是将原本的聚合划分成两阶段,第一阶段先做一个local的聚合,这个阶段不需要数据shuffle,是直接跟在上游算子之后进行处理的;第二个阶段是要对第一个阶段的结果做一个merge(和session window的merge要求是一样的,如果存在没有实现merge的聚合函数,那么这个优化就不会生效)。
-
Distinct状态复用 对于distinct的优化,一般批里面的引擎都是通过把它优化成aggregate的方式来处理,但是在流式window中直接这样进行优化,算子就会变成会下发retract的数据。所以在流式中,对于count distinct这种情况,我们是需要保存所有数据是否出现过的一个映射。
-
滑动窗口pane复用 滑动窗口的一条数据可能会属于多个window。所以这种情况下同一个key下的window数量可能会比较多,这样对于状态访问频率是比较高的,而且计算量也会增加很多。 优化方法就是,将窗口的状态划分成更小粒度的pane,对一条数据,我们只更新这条数据对应的pane的结果就可以了。当窗口需要输出结果的时候,只需要将这个窗口对应的pane的结果merge起来就可以了。 注意:这里也是需要所有聚合函数都有merge的实现的。