窗口分类

按照驱动类型分类

窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息就是“怎样截取数据”。换句话说,就是以什么标准来开发和结束数据的截取。

按照驱动类型分类主要分为两类:时间窗口与计数窗口

1、时间窗口

时间窗口以时间点来定义窗口的开始与结束,所以截取出的就是某一段时间的数据,窗口的时间范围都是左闭右开的原则[start,end);

2、计数窗口

计数窗口基于元素的个数来截取数据,到达固定的个数时就触发计算并关闭窗口。

计数窗口相比时间窗口更加简单,我们只需要指定窗口大小,就可以把数据分配到对应的窗口当中,在flink内部也并没有对应的类来标识计数窗口,底层是通过“全局窗口”来实现的。

按照窗口分配数据的规则分类

时间窗口与计数窗口,只是对窗口的一个大致划分,在具体应用时,还需要定义更加精细的规则,来控制数据应该划分到哪个窗口中去,不同的分配数据的方式,就可以有不同的功能应用。

根据分配数据的规则,窗口的具体实现可以分为4类,滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)、会话窗口(Session Window)、全局窗口(Global Window)

  • 滚动窗口

    滚动窗口有固定的大小,是一种对数据进行“均匀切片”的划分方式。窗口之间没有重叠,也不会有间隔,是首尾相接的状态。

    滚动窗口可以基于时间定义,也可以基于数据个数定义,需要的参数只有一个,就是窗口大小。

    滚动窗口的应用非常广泛,它可以对每个时间段做聚合统计,很多bi分析指标都可以用它来实现。

  • 滑动窗口

    与滚动窗口类似,滑动窗口的大小也是股东的。区别在于,窗口之间并不是首尾相接的,而是可以错开一定的位置。

    滑动窗口是固定大小窗口更广泛的一种形式,滚动窗口也可以看做是一种特殊的挂冬窗口-窗口大小等于步长(size = slide)

    在一些场景中,可能需要统计最近一段时间内的指标,而结果的输出频率要求又很高,甚至要求实时更新,比如股票价格24小时的涨跌幅统计,或者基于一段时间内行为检测异常报警,这是滑动窗口无疑就是很好的实现方式。

  • 会话窗口

    会话窗口,顾名思义,就是基于会话来对数据进行分组的。这里的会话类似web应用中的session的概念,不过并不标识两端的通讯过程,而是借用会话超时失效的机制来描述窗口。数据来了就开启一个会话窗口,如果超过指定时间没有收到数据,那么就认为会话失效,窗口自动关闭。

    与滑动窗口和滚动窗口不一样,会话窗口只能基于时间来定义。

    考虑到时间语义下的乱序流,相邻两个数据的时间间隔gap大于指定size的大小,被判定为两个窗口,上一个窗口就可以关闭,可在乱序数据的情况下,可能会有迟到数据,他的时间戳恰好在之前的两个数据之间的,这样一来,之前我们判断的间隔中就不是“一直没数据”,而合并之后的间隔有可能比size还小-标识这三个数据应该是同一个会话窗口。

    flink底层,对会话窗口的处理比较特殊:每来一个新数据,都会创建一个新的会话窗口,然后判断已有窗口之间的距离,如果小于给定的size,就对他们进行合并。在window算子中,对会话窗口会有单独的处理逻辑。

    对比之前的两种窗口,会话窗口的长度不固定,起始与结束时间也是不确定的,各个分区之间窗口没有任何关联。会话窗口一定是不会重叠的,而且会留下至少为size的间隔。

  • 全局窗口

    全局窗口是一类比较通用的窗口,这种窗口全局有效,会把相同key的所有数据都分配到同一个窗口中,就跟没有分窗口一样。无界流的数据永无止尽,所以这种窗口也没有结束的时候,默认是不会触发计算的,如果希望对数据进行计算处理,还需要自定义触发器。

窗口分配器

  • 时间窗口

    1、滚动处理时间窗口

    窗口分配器由TumblingProcessingTimeWindows提供,传入一个time类型的参数,标识滚动窗口的大小。
 stream.keyBy(...).window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
.aggregate(...)

2、滑动处理时间窗口

窗口分配器由类SlidingProcessingTimeWindows提供,需要两个time类型的参数,size和slide,前者表示滑动窗口的大小,后者表示滑动窗口的步长。滚动窗口就是滑动窗口的特殊情形-size = slide

       stream.keyBy(...).window(SlidingProcessingTimeWindows.of(Time.seconds(10),Time.seconds(5)))
.aggregate(...)

3、处理时间会话窗口

窗口分配器由类ProcessingTimeSessionWindows提供,需要调用它的.withGap()方法或者.withDynamicGap(),

.withGap()方法需要传入一个time类型的参数size,表示会话的超时时间,也就是最小间隔session gap

.withDynamicGap()需要传入一个SessionWindowTimeGapExtractor作为参数,用来定义session gap的动态提取逻辑。

     stream.keyBy(...).window(ProcessingTimeSessionWindows.withGap())
.aggregate(...)

4、滚动事件时间窗口

窗口分配器由类TumblingEventTimeWindows提供,用法与滚动处理事件窗口完全一致。


stream.keyBy(...).window(TumblingEventTimeWindows.of(Time.seconds(5)))
.aggregate(...)

5、滑动事件时间窗口

窗口分配器由类SlidingEventTimeWindows提供,用法与滑动处理事件窗口完全一致。

  stream.keyBy(...).window(SlidingEventTimeWindows.of(Time.seconds(10),Time.seconds(5)))
.aggregate(...)

6、事件时间会话窗口

窗口分配器由EventTimeSessionWindows提供,用法与处理事件会话窗口完全一致。

      stream.keyBy(...).window(EventTimeSessionWindows.withGap(Time.seconds(10)))
.aggregate(...)

窗口的生命周期

  • 窗口的创建

    窗口的类型和基本信息由窗口分配器(window assigners)指定,但窗口不会预先创建好,而是由数据驱动创建,当第一个应该属于该窗口的元素到达时,就会创建对应的窗口。
  • 窗口计算的触发

    每个窗口都会有自己的窗口函数和触发器,窗口函数可以分为增量聚合函数和全窗口函数,主要定义了窗口中计算的逻辑,而触发器则是指定调用窗口函数的条件。
  • 窗口的销毁

    一般情况下,当时间达到了结束点,就会触发计算输出结果、进而清楚状态销毁窗口,这时的窗口的销毁可以认为和触发计算是同一时刻。这里需要注意,flink中只对时间窗口(TimeWindow)有销毁机制,由于计数窗口(CountWindow)是基于全局窗口(GlobalWindow)实现的,全局窗口不会清除状态,所以就不会被销毁。

    在特殊场景下,窗口的销毁和触发计算会有所不同,事件时间语义下,如果设置了允许延迟,那么在水位线到达窗口结束时间时,仍然不会销毁窗口:窗口真正被完全删除的时间点,是窗口的结束时间加上用户指定的允许延迟时间。

flink窗口分类的更多相关文章

  1. 斯坦福深度学习与nlp第四讲词窗口分类和神经网络

    http://www.52nlp.cn/%E6%96%AF%E5%9D%A6%E7%A6%8F%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E4%B8%8Enlp%E7%A ...

  2. 第08讲:Flink 窗口、时间和水印

    Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...

  3. Flink窗口介绍及应用

    Windows是Flink流计算的核心,本文将概括的介绍几种窗口的概念,重点只放在窗口的应用上. 本实验的数据采用自拟电影评分数据(userId, movieId, rating, timestamp ...

  4. Flink(八)【Flink的窗口机制】

    目录 Flink的窗口机制 1.窗口概述 2.窗口分类 基于时间的窗口 滚动窗口(Tumbling Windows) 滑动窗口(Sliding Windows) 会话窗口(Session Window ...

  5. Flink架构、原理与部署测试

    Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为 ...

  6. Flink架构、原理与部署测试(转)

    Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为 ...

  7. Flink学习(一)

    Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为 ...

  8. Flink初探-为什么选择Flink

    本文主要记录一些关于Flink与storm,spark的区别, 优势, 劣势, 以及为什么这么多公司都转向Flink. What Is Flink 一个通俗易懂的概念: Apache Flink 是近 ...

  9. 阿里重磅开源全球首个批流一体机器学习平台Alink,Blink功能已全部贡献至Flink

    11月28日,Flink Forward Asia 2019 在北京国家会议中心召开,阿里在会上发布Flink 1.10版本功能前瞻,同时宣布基于Flink的机器学习算法平台Alink正式开源,这也是 ...

随机推荐

  1. Vue报错Cannot read property 'split' of undefined

    今天在项目中处理后端返回的字符串需要使用split做一个字符串转数组的处理,之前项目都运行得好好的,今天突然出问题了,然后面向百度编程了一波,如果你也是用的异步向后端发送请求,可能你的问题和我一样,继 ...

  2. Struts2-获取值栈对象与结构

    1.获取值栈对象有多种方式 (1)使用ActionContext类里面的方法获取值栈对象 @Override public String execute(){ //1.获取ActionContext类 ...

  3. Jenkins+gitlab手动部署

    环境: Jenkins:172.16.88.221 (安装Jenkins和git命令) gitlab:172.16.88.221 (安装gitlab) 远程部署机器:172.16.88.220 (安装 ...

  4. Kubernetes探针原理详解

    前言: 分布式系统和微服务体系结构的挑战之一是自动检测不正常的应用程序,并将请求(request)重新路由到其他可用系统,恢复损坏的组件.健康检查是应对该挑战的一种可靠方法.使用 Kubernetes ...

  5. 时序数据库influxDB介绍

    https://www.jianshu.com/p/68c471bf5533 https://www.cnblogs.com/wzbk/p/10569683.html

  6. MySQL基础之写表(创建表)

    我的博客 工具 市面上的SQL可视化工具不少,我一般常用的主要就是这两个. 当然,IDEA也是集成了数据库可视化功能的.除了这些,还有DBeaver.SQLyog等等. 我比较喜欢DataGrip,我 ...

  7. 数据结构篇(3)ts 实现双向链表

    如今终于到了双向链表了,此前在Node结构中的prev指针终于派上了用场.由于双向链表多了一个前向指针,所以有些操作和单向链表比较起来反而更加的简单. class DbList extends Cir ...

  8. 从0开始用webpack开发antd,react组件库npm包并发布

    一.初始化一个npm包 1.新建一个文件夹(名称随意,建议和报名一致),输入命令 :npm init -y 会自动生成一个包的说明文件 package.json如下(本文以scroll-antd-ta ...

  9. FreeRTOS --(5)内存管理 heap4

    FreeRTOS 中的 heap 4 内存管理,可以算是 heap 2 的增强版本,在 <FreeRTOS --(3)内存管理 heap2>中,我们可以看到,每次内存分配后都会产生一个内存 ...

  10. 在centos 7 中 conda 环境和Python2.7 中安装远程jupyter

    折腾了半天,为了能够方便学习TensorFlow,搞了远程的jupyter,方便在本地使用它,今天填了不少坑. 装完后截图: 下面是一些步骤: 检查 Python 环境 CentOS 7.2 中默认集 ...