Flink1.10入门:Window窗口机制简介

一、Window概念


图片

   

    上面是Flink1.10的官方文档的一句话,翻译了一下大体意思是:Window是处理无限数据流的核心,Windows将流分割为有限大小的“buckets”,我们可以在上面应用计算。

    

   Flink认为批处理是流处理的一种非常特殊的情况。在流处理中,我们为数据定义滑动窗口或滚动窗口,并且在每次窗口滑动或滚动时生成结果。批处理则不同,我们定义一个全局窗口,所有的记录都属于同一个窗口;Flink 底层引擎是一个流式引擎,在上面实现了流处理和批处理。而窗口(window)就是从 Streaming 到 Batch 的一个桥梁。


二、Window分类

 

1.keyed streams和non-keyed streams

   Flink程序在窗口计算之前,先对数据做分流,有两种控制流的方式:第一种是keyed streams;第二种non-keyed streams;

图片


    由上图可知,对于keyed streams调用的是keyBy和window,先对数据流根据key进行了分组,经过keyBy的数据流将形成多组数据,下游的算子的多个实例可以并行计算,而non-keyed streams调用的是windowAll,不会对数据流进行分组,所有的数据将发送到下游的单个实例进行处理。两种控制流的原理基本类似,唯一的区别就是发送给下游的多个或单个算子进行计算。


2.Window Assinger


    数据经过控制流的处理之后,两种控制流都需要指定一个window Assinger,负责将每个传入的元素分配给一个或多个窗口,有了window Assinger,才会创建出各种形式的window来覆盖我们所需的各种场景,对我们开发来说不需要关注window本身,只需要关注Window Assinger的分类即可,所以很多关于Flink的视频都没有讲解控制流的概念,只讲了Window的分类。


3.Window Assinger分类


    Flink为最常见的用例(即滚动窗口、滑动窗口、会话窗口和全局窗口)提供了预定义的Window Assinger程序。您还可以通过扩展Window Assigner类来实现自定义窗口assigner。所有内置的窗口分配程序(全局窗口除外)都根据时间将元素分配给窗口,时间可以是处理时间,也可以是事件时间。


    Window 可以是基于时间驱动的(Time Window,例如:每60秒钟),也可以是基于数据驱动的(Count Window,例如:每200个元素)。同时基于不同事件驱动的窗口又可以分成以下几类:滚动窗口 (Tumbling Window, 无重叠)、滑动窗口 (Sliding Window, 有重叠)、会话窗口 (Session Window, 活动间隙)、全局窗口。下面我就结合ApacheFlink官网文档给大家讲解下这四种窗口。


3.1 Tumbling Window(滚动窗口)


    滚动窗口将每个元素分配给指定窗口大小的窗口。滚动窗口有一个固定的大小且元素不重叠。例如,如果您指定了一个大小为5分钟的滚动窗口,那么将计算当前窗口并每5分钟启动一个新窗口,如下图所示。

图片


3.2 Sliding Windows(滑动窗口)


    滑动窗口分配程序将元素分配给固定长度的窗口。类似于滚动窗口分配程序,窗口的大小由窗口大小参数配置。一个附加的窗口滑动参数控制滑动窗口启动的频率。因此,如果滑动窗口比窗口大小要小,则滑动窗口可以重叠。在这种情况下,元素被分配给多个窗口。例如,您可以有10分钟大小的窗口,它可以滑动5分钟。这样,您每5分钟就会得到一个包含最近10分钟内到达的事件的窗口,如下图所示。

图片


3.3 Session Windows(会话窗口)


    会话窗口分配程序根据活动的会话对元素进行分组。与滚动窗口和滑动窗口相比,会话窗口没有重叠,也没有固定的开始和结束时间。相反,当某个会话窗口在一段时间内没有接收到元素时,它就会关闭。当一个不活跃的间隙出现时。会话窗口分配程序可以配置为静态会话间隔,也可以配置为会话间隔提取器函数,该函数定义了不活动期间的长度。当此期间过期时,当前会话将关闭,随后的元素将分配给新会话窗口,如下图所示:

图片

3.4 Global Windows(全局窗口)


    全局窗口分配程序将具有相同键的所有元素分配给同一个全局窗口。此窗口模式仅在您还指定自定义触发器时才有用。否则,将不执行任何计算,因为全局窗口没有一个可以处理聚合元素的自然末端,所有相同keyed的元素分配到一个窗口里,这种窗口很少使用,如下图所示:

图片

    至此,Flink的Window机制的一些概念介绍完毕,这里只做了一些简单的介绍,后面会结合代码再分别来讲这些窗口机制,感谢关注!!!


猜你喜欢

转载自blog.51cto.com/15080019/2653870