Flink是一个流式计算框架,在流处理应用中,数据是连续不断的;但有时候的业务需求,需要我们在在流的基础上做一定的聚合处理,比如两个元素计算一次结果,或者五秒钟计算一次结果…应用到实际中的场景则为过去一分钟用户点击量、过去一小时订单成交额度…等等
故此,Flink引入了窗口
这个概念,窗口(Window)是Flink程序中算子之一,是处理无限的核心。窗口将流分成有限大小的“存储块”,我们可以在其上应用计算。
如同生活中所见的窗口一样,我们可以将Flink中的窗口算子理解为一种数据通道,比如我们规定,这个窗子打开后,向里边丢小球,每当窗口另一边有了十个小球,便做什么事情(比如计算所有小球重量,后者比较十个小球中最大或最小的数据…)
如果按照上方说的示例(过去一分钟用户点击量),我们则须定义一个窗口(window),用来收集最近1分钟内的数据,并对这个窗口内的数据进行计算。
time-window:时间窗口:
根据时间划分窗口,每过一定时间,触发窗口计算 如:每5分钟计算最近5分钟的数据结果
count-window:数量窗口:
根据数量划分窗口,每达到一定数量,触发窗口计算 如:每3个数据计算一次最近3个数据结果
窗口有两个重要的属性: 窗口大小size和滑动间隔slide,根据它们的大小关系可分为:
tumbling-window:滚动窗口:size=slide,如:每隔10s统计最近10s的数据
sliding-window:滑动窗口:size>slide,如:每隔5s统计最近10s的数据
那么问题来了
如果我设置间隔十五秒计算一次最近五秒钟的数据 (size
答:可以是可以,因为Flink本身不会限制你这种设置;但是15秒计算一次最近5秒数据,那么另外的10秒数据呢便丢掉了!!!!除特殊场景外,此种操作基本无实用性!
注意点:虽然窗口 有滚动与滑动之分,但是必须要设置的符合基本逻辑,像上边这种设置,导致数据丢失,其最后计算结果出差错那是必然的,设置窗口大小与滚动滑动间隔必须要严谨一点…
基于时间的滚动窗口tumbling-time-window
基于时间的滑动窗口sliding-time-window
基于数量的滚动窗口tumbling-count-window
基于数量的滑动窗口sliding-count-window
在我个人公司目前的开发工作中中,基于数量的滚动窗口与基于事件的滚动窗口用的还是比较多的,但是具体的使用场景还是得看具体业务
前边已经简单的说了flink计算程序开发步骤 :获取环境、加载数据源、算子处理、数据输出;Window操作也是属于算子处理这一步。
我们只需要在数据源( 可选是否使用KeyBy算子,是否使用KeyBy大有讲究,后边点会细讲)后调用对应window算子方法即可,
如果您要基于数量窗口进行计算,可直接指定为CountWindow
算子
WindowAssigner
是窗口分配器,就是将我们的数据,根据定义的分配器策略分配到不同的类型窗口中
下图是Flink1.12中,WindowAssigner
支持的所有窗口
下边这些窗口,每一种都有着不同的应用场景,种类繁多,我这里不会一一演示,但其作用与他的名字是一致的,比如TumblingProcessingTimeWindows
基于处理时间的时间窗口,什么是处理时间?后续在Flink time专题栏会讲到,请敬请期待…
Window
是Flink
程序中算子之一,是处理无限的核心,窗口将流分成有限大小的“存储块”,我们可以在其上做一定的数据聚合,应用计算
我们可以将Window 视作为数据流处理与批处理的桥梁
下一篇
…
Flink程序中窗口的具体使用