窗口分类

按照驱动类型分类

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

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

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. victoriaMetrics之byteBuffer

    victoriaMetrics之byteBuffer VictoriaMetrics经常会处理数目庞大的指标,在处理的过程中会涉及指标的拷贝,如果在指标拷贝时都进行内存申请的话,其内存消耗和性能损耗都 ...

  2. redis集群在线迁移第一篇(数据在线迁移至新集群)实战一

    迁移背景:1.原来redis集群在A机房,需要把其迁移到新机房B上来.2.保证现有环境稳定.3.采用在线迁移方式,因为原有redis集群内有大量数据.4.如果是一个全新的redis集群搭建会简单很多. ...

  3. 帝国cms一键排版删除段落前两个空格和换行符

    打开网站根目录下e\class\function.php文件:一.删除两个空格: 搜索:$nbsp=' '; 改为:$nbsp=''; 二.删除<br>换行符 搜索: $ok='<b ...

  4. 序列化之Serializer类与ModelSerializer类的使用

    序列化之Serializer类的使用(5星) 作用: 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 反序列化,把客户端发送过来的数据,经过request以后变成字 ...

  5. 坐实大数据资源调度框架之王,Yarn为何这么牛

    摘要:Yarn的出现伴随着Hadoop的发展,使Hadoop从一个单一的大数据计算引擎,成为大数据的代名词. 本文分享自华为云社区<Yarn为何能坐实资源调度框架之王?>,作者: Java ...

  6. 【Azure API 管理】解决API Management添加AAD Group时遇见的 Failed to query Azure Active Directory graph due to error 错误

    问题描述 为APIM添加AAD Group时候,等待很长很长的时间,结果添加失败.错误消息为: Write Groups ValidationError :Failed to query Azure ...

  7. Blazor 组件库 BootstrapBlazor中 Ajax 组件的使用

    组件解决的问题 由于Blazor在与服务器连接时使用了Websocket,仅在第一次连接时会走原MVC的连接逻辑.所以,我们无法在这个过程中完成例如身份认证.cookie处理等操作. 此组件即为解决此 ...

  8. Confluent之Kafka Connector初体验

    概述 背景 Apache Kafka 是最大.最成功的开源项目之一,可以说是无人不知无人不晓,在前面的文章<Apache Kafka分布式流处理平台及大厂面试宝典>我们也充分认识了Kafk ...

  9. List实现类

     List实现类: ArrayList; 数组结构实现,查询快,增删慢 JDK1.2版本,运行效率快,线程不安全 Vector: 数组结构实现,查询快,增删慢 JDK1.0版本,运行效率慢,线程安全 ...

  10. 微信小程序wx.login先执行onLaunch与onLoad加载顺序问题

    @ 目录 遇到问题 请求api返回需要先登录,实际上登录已成功 问题分析 解决问题 自定义回调函数 app.js index.js 扩展提问 学习交流 随机数字随机幸运数+ My Blog 技术交流 ...