flink窗口分类
窗口分类
按照驱动类型分类
窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息就是“怎样截取数据”。换句话说,就是以什么标准来开发和结束数据的截取。
按照驱动类型分类主要分为两类:时间窗口与计数窗口
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窗口分类的更多相关文章
- 斯坦福深度学习与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 ...
- 第08讲:Flink 窗口、时间和水印
Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...
- Flink窗口介绍及应用
Windows是Flink流计算的核心,本文将概括的介绍几种窗口的概念,重点只放在窗口的应用上. 本实验的数据采用自拟电影评分数据(userId, movieId, rating, timestamp ...
- Flink(八)【Flink的窗口机制】
目录 Flink的窗口机制 1.窗口概述 2.窗口分类 基于时间的窗口 滚动窗口(Tumbling Windows) 滑动窗口(Sliding Windows) 会话窗口(Session Window ...
- Flink架构、原理与部署测试
Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为 ...
- Flink架构、原理与部署测试(转)
Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为 ...
- Flink学习(一)
Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为 ...
- Flink初探-为什么选择Flink
本文主要记录一些关于Flink与storm,spark的区别, 优势, 劣势, 以及为什么这么多公司都转向Flink. What Is Flink 一个通俗易懂的概念: Apache Flink 是近 ...
- 阿里重磅开源全球首个批流一体机器学习平台Alink,Blink功能已全部贡献至Flink
11月28日,Flink Forward Asia 2019 在北京国家会议中心召开,阿里在会上发布Flink 1.10版本功能前瞻,同时宣布基于Flink的机器学习算法平台Alink正式开源,这也是 ...
随机推荐
- 麒麟系统开发笔记(三):从Qt源码编译安装之编译安装Qt5.12
前言 上一篇,是使用Qt提供的安装包安装的,有些场景需要使用到从源码编译的Qt,所以本篇如何在银河麒麟系统V4上编译Qt5.12源码. 银河麒麟V4版本 系统版本: Qt源码下载 ...
- XXE漏洞——介绍及利用
什么是xxe XML外部实体注入,简称XXE漏洞.XML文档结构包括XML声明,DTD文档类型定义,文档元素. XML示例 <?xml version="1.0"?>X ...
- spring-基于注解的aop开发(快速入门)
步骤: 1.导入坐标 <dependency> <groupId>junit</groupId> <artifactId>junit</artif ...
- asp.net core启动源码以及监听,到处理请求响应的过程
摘要 asp.net core发布至今已经将近6年了,很多人对于这一块还是有些陌生,或者说没接触过:接触过的,对于asp.net core整个启动过程,监听过程,以及请求过程,响应过程也是一知半解,可 ...
- Git上传本地仓库文件到Gitee(Github同理)
前言:本来想把最近的代码更新到Github上,但是校园网打不开,于是决定暂时先更新到Gitee中,Github中的操作也同理. 1. 创建云仓库: 就是在Gitee/Github上创建仓库,这里不演示 ...
- 使用pip管理库
2.5 使用pip管理库 安装Python后会默认安装pip工具,该工具可以用来安装.升级和移除库.默认情况下 pip 将从[Python Package Index]https://pypi.org ...
- fpm工具来制作rpm包软件
第1章 rpm包的制作 1.1 fpm的概念介绍 FPM功能简单说就是将一种类型的包转换成另一种类型 1.1.1.支持的源类型 类型 说明 dir 将目录打包成所需要的类型,可以用于源码编译安装的 ...
- Google广告批量投放脚本
该脚本文件是一个转化文件,将编辑的Google投广告模板转化成Google批量投放广告的脚本文件,实现批量投放广告,节省投广时间.PS:要与相应的模板结合使用,投广告模板在本人博客的文件中,可以下载. ...
- [DEBUG] QAT Nginx for docker 部署时"--with-ld-opt"出错
layout: post title: [DEBUG] QAT Nginx for docker 部署时"--with-ld-opt"出错 subtitle: 记一次debug经历 ...
- 【大话云原生】kubernetes灰度发布篇-从步行到坐缆车的自动化服务升级
此文系[大话云原生]系列第四篇,该系列文章期望用最通俗.简单的语言说明白云原生生态系统内的组成.架构以及应用关系.从这篇开始我们要开始针对Kubernetes进行介绍了,本文内容如下: 一.Kuber ...