00:00
我们说这个窗口分配器,它是分了很多种类型,时间窗口,技术窗口,呃,另外还可以从另外一个维度啊,滚动窗口,滑动窗口,会话窗口,那现在窗口函数它只有一种吗?是不是可以有多种呢?没错,F给我们定义的窗口操作非常的灵活,非常丰富,它给我们提供了两大类窗口函数。其实之前就提出了类似的问题,就是说诶,你对于这个窗口操作而言,这不就是把一堆数据都攒着放到这儿,你说八点到九点,诶,那我就攒一个小时的数据,等到九点钟的时候,不管是wal mark到了九点去触发,还是说处理时间啊,就是我的系统时间到了九点去出发,诶反正都是到这个点我才会去处理收集好的那些数据,去做一个计算输出,这不就是批处理吗?啊,所以大家会发现窗口它本身就是把无限的数据流结成有限集合进行统计计算的一个方法,那所以它本身其实就可以看成是有借流嘛,有借流当然就是flink里边做批处里,现在不是批流统一了吗?它本身就是做批处理的一种方式。
01:10
那么对于flink而言,它的批处理啊,或者说我们认为这个窗口的这种有界流的截取处理,跟在Spark里边,或者其他的这些批处理系统里边直接做的批处理有什么区别呢?啊,如果你都一样的话,那这个延迟也太高了啊,你都是攒一大批数据,如果这个窗口,比方说啊,我们要统计月活,你想如果要统计月活的话,一个月的数据全收集起来,然后等到这个月末那一天晚上24点结束的时候。统一开始计算,那这个数据你要算到什么时候啊,那可能算一两天都算不完,有可能这个显然是不够合理的。那所以在link里边就用流式的处理思路给我们提供了一种窗口的计算方案,这种方案就叫做增量聚合函数,哎,什么叫增量聚合函数呢?简单来讲就是即使是窗口,那它也是流啊,它的数据也是一个一个来的,还是流式数据嘛,那只不过它这个有界流而已,对于有借流,我们怎么处理呢?你就跟平常的流处理一样,来一个就处理一个,来一个就处理一个,只不过你现在是一个窗口计算,我是要把这些数据。
02:26
哎,都收集齐了,最后再再输出,那怎么样呢?那我就是来一个数据,我就处理一次,做一个叠加计算,把它存在这儿,再来一个,再把它叠加计算存在这儿,再来一个,所有的全计算完了,我该算的都算完了,只不过不输出,等到最后到时间点的时候,我直接把计算的最后结果拿出来输出不就完了吗?啊,所以大家就看到了,这个增量聚合其实就是流处理的思路,用来做批处理的。
03:00
类比我们刚才举的这个例子啊,如果是考虑月活的话,那就是一个什么场景。之前我们想象的批处理是一开始先收集一个月的数据,先攒攒在那儿,然后等到这个月到达结束时间的时候,啊,月末那天的晚上24点的时候,然后开始一个一个再去算,一个一个再去点。嗯,我现在是什么呢?我是来一个就点一次,来一个就点一次,等到月末那个时间点的时候,当前一共有多少月活,一共有多少数据,是不是都已经点清楚了呀,所以我只要到那一时刻直接把这个数据输出不就完事了吗?哪还用再去算几天呢。所以大家就看到了真正的流处理,它的快到底是快在哪了,其实就是快在了中间攒数据的过程,我就把他们该计算的都已经计算完了,不需要在最后再去遍利一次,挨个去计算了,所以当然就比批处理要快。啊,你对于有一些批处理而言,它是数据本身来的时候就是一批啊,那这个就没什么用对吧,你总得是一批都读进来,然后然后一起去处理,那对于流处理而言,你的数据本来就是一个一个来的,先后来的,那我当然可以来多少就处理多少啊,这就快很多嘛,啊所以这其实应用就非常的广泛啊,就会快非常多,这就是增量聚合函数,Link里边给我们提供了两个增量聚合函数,一个叫做reduce function,一个叫做aggregate function。
04:29
Reduce function简单来讲呢,就跟之前我们在K之后做的那个reduce是一样的,具体来讲,我们在代码里面应用的时候,就是直接点window开窗之后,然后来一个点reduce,实现这样一个功能。那另外窗口除了这种流式的啊,增量聚合的方式还有哪一种呢?啊,窗口函数其实分了两大类,一类是这种增量聚合函数,用流式的思维去处理窗口里边的所有数据,那另外一种方式呢,那当然就是纯批示了,就是大家想的那样,所有的数据来了之后,不处理就攒着,就收集起来,就给你一块空间缓存起来放着吧,然后怎么样呢?等到窗口要触发计算的时候啊,结束时间到了,这个时候拿出来你该怎么做怎么做,所有数据都在这儿了,你你说想干啥吧。
05:20
哎,所以这一类函数就叫做全窗口函数,其实就是所谓的用了流处理的思路和批处理的思路来处理窗口数据。分别是增量聚合函数和全窗口函数。
我来说两句