概述

flink中支持多种窗口,包括:时间窗口,session窗口,count窗口等,本文简单介绍这些窗口的原理,并通过例子说明如何使用这些窗口。

时间窗口(Time Windows)

最简单常用的窗口形式是基于时间的窗口,flink支持两种时间窗口:

  • 一种是翻滚时间窗口(tumbling time window)
  • 一种是滑动时间窗口(sliding time window)

翻滚时间窗口(tumbling time window)

翻滚时间窗口的窗口是固定的,比如设定一个1分钟的时间窗口,该时间窗口将只计算当前1分钟内的数据,而不会管前1分钟或后1分钟的数据。

如上图所示,编写了一个1分钟的翻滚窗口,用来收集最后一分钟的值,并在1分钟结束时输出它们的总和。

从上图可见,该窗口只会计算从当前计时开始的1分钟内的数据,当1分钟完成时输出结果。然后,从完成这一刻起开始计算1分钟内的数据,依次类推。

一个翻滚窗口的定义如下:

    val env = StreamExecutionEnvironment.getExecutionEnvironmentval text = env.socketTextStream("localhost", 9999)val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } }.map { (_, 1) }.keyBy(0).timeWindow(Time.seconds(5))  //定义一个5秒的翻滚窗口.sum(1)

滑动时间窗口(sliding time window)

滑动窗口,顾名思义,该时间窗口是滑动的。所以,从概念上讲,这里有两个方面的概念需要理解:

  • 窗口:需要定义窗口的大小
  • 滑动:需要定义在窗口中滑动的大小,但理论上讲滑动的大小不能超过窗口大小

下面我们来看一个图例:

如上图所示,定义了一个1分钟的滑动窗口。在第一个滑动窗口中,将值9,6,8和4相加,得到结果27。接着,窗口滑动半分钟(例如,在我们的示例中为2个值),此时窗口中的值为8,4和7,3,产生结果22,以此类推。

可以在Flink中定义1分钟的滑动窗口,每30秒滑动一次,定义如下:

stream.timeWindow(Time.minutes(1), Time.seconds(30))

定义中,1分钟为窗口时间,30秒为滑动时间。

滑动窗口使用例子

import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Timeobject WindowWordCount {def main(args: Array[String]) {println("start word count")val env = StreamExecutionEnvironment.getExecutionEnvironmentval text = env.socketTextStream("localhost", 9999)val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } }.map { (_, 1) }.keyBy(0).timeWindow(Time.seconds(5), Time.seconds(3))  // 定义了一个滑动窗口,窗口大小为5秒,每3秒滑动一次.sum(1)counts.print()println("end word count")env.execute("Window Stream WordCount")println("exit now!")}
}

可以在另一个终端通过命令nc -lk 9999输入一些数据,查看一下效果,并理解一下。

this is a test, time windows.

为了,省去编译和打包的麻烦,可以直接在flink的scala-shell中,修改一下上面的程序,把evn改成senv。

    val text = senv.socketTextStream("localhost", 9999)val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } } .map { (_, 1) } .keyBy(0) .timeWindow(Time.seconds(5), Time.seconds(3)) .sum(1)counts.print()senv.execute("Window Stream WordCount")

总结

本文介绍了flink中事件窗口的基本概念。时间窗口在流式计算中是一个非常核心的概念,需要很好的理解。

flink实战—时间窗口(Time Windows)的原理和使用相关推荐

  1. 时间窗口(Time Windows)的原理和使用

    概述 flink中支持多种窗口,包括:时间窗口,session窗口,count窗口等,本文简单介绍这些窗口的原理,并通过例子说明如何使用这些窗口. 时间窗口(Time Windows) 最简单常用的窗 ...

  2. java Flink滚动时间窗口聚合TumblingProcessingTimeWindows运算例子

    整个的思路是: 构造数据源 窗口聚合代码 1. 构造数据源 首先构造数据,新建一个MyData2.java的文件,写入这个MyData2的类 package create_data;import ja ...

  3. Flink从入门到真香(12、Flink一大利器-时间窗口)

    flink中支持多种窗口,包括:时间窗口,session窗口,统计窗口等等,能想到的基本都可以实现 时间窗口(Time Windows) 最简单常用的窗口形式是基于时间的窗口,flink支持三种种时间 ...

  4. 限流算法-固定时间窗口

    本文介绍了固定时间窗口限流算法. 前言 首先限流的算法有很多种,比如固定时间窗口限流算法.滑动时间窗口算法.漏桶算法.令牌桶算法,其余的算法后续我们会一一介绍. 一.限流场景 站在服务调用方的角度来说 ...

  5. Flink实战—基于时间窗口定时输出sink

    Flink时间窗口运用 上一篇介绍了Flink定时读取外部数据Flink 定时加载外部文件数据并广播 这一篇将介绍Flink定时输出到外部存储介质,有两种办法实现,一种是同上一篇一样,在RichXXX ...

  6. Flink窗口全解析:三种时间窗口、窗口处理函数使用及案例

    我们经常需要在一个时间窗口维度上对数据进行聚合,窗口是流处理应用中经常需要解决的问题.Flink的窗口算子为我们提供了方便易用的API,我们可以将数据流切分成一个个窗口,对窗口内的数据进行处理.本文将 ...

  7. 【Flink】各种窗口的使用(处理时间窗口、事件时间窗口、窗口聚合窗口)

    文章目录 一 Flink 中的 Window 1 Window (1)Window概述 (2) Window类型 a 滚动窗口(Tumbling Windows) b 滑动窗口(Sliding Win ...

  8. Flink教程(3) 大白话 时间 窗口 watermark

    大白话 时间 窗口 watermark 一.前言 二.流处理术语 1 延迟和吞吐 1.1 延迟 1.2 吞吐 2 数据流上的操作 2.1 数据接入和数据输出 2.2 转换操作 2.3 滚动聚合 2.4 ...

  9. 万字详述 Flink SQL 4 种时间窗口语义!(收藏)

    DML:窗口聚合 大家好我是老羊,由于窗口涉及到的知识内容比较多,所以博主先为大家说明介绍下面内容时的思路,大家跟着思路走.思路如下: ⭐ 先介绍 Flink SQL 支持的 4 种时间窗口 ⭐ 分别 ...

  10. Flink学习:Flink如何打印窗口的开始时间和结束时间

    Window 一.简介 二.代码实现 三.测试 一.简介 大家知道,Flink用水位线和窗口机制配合来处理乱序事件,保证窗口计算数据的正确性,当水位线超过窗口结束时间的时候,就会触发窗口计算 水位线是 ...

最新文章

  1. java并发编程实战:第十六章----Java内存模型
  2. 贪吃蛇游戏(c/c++)
  3. win10 docker desktop无法拉取镜像解决办法
  4. Linux 2.6.32-279.el6.x86_64 ANDROID SDK碰到”LIBC.SO.6: VERSION `GLIBC_2.14′ NOT FOUND”的解决方法(1)
  5. codevs 1576 最长严格上升子序列
  6. 【树链剖分】LCA(P4211)
  7. 前端学习(3246):react的生命周期getSnap
  8. Javascript 之《函数传参到底是值传递还是引用传递》
  9. 微课|玩转Python轻松过二级:第3章课后习题解答2
  10. 按值传递和按引用传递的区别_c++按值、地址、引用传递参数
  11. 将网页转换成PDF文件的N种方式
  12. android studio svn 忽略文件
  13. OpenLayers坐标转换
  14. 《S.忒修斯之船》读后感600字心得体会
  15. MySQL必知必会(2)
  16. 分立式数码管循环显示数字0到9.
  17. catia v5r21保姆级下载安装教程
  18. CSDN没有适配竖屏显示器(3840x2160)
  19. Mysql如何添加环境变量(详细教程)
  20. 通过Kali Linux暴力破解WiFi密码

热门文章

  1. 让我康康,是谁进了 Hack for wuhan 初赛?
  2. JavaScript与浏览器
  3. html不能默认IE浏览器,编辑告诉您win7如何设置ie为默认浏览器的完全解决办法
  4. ios备忘录下载安卓版_ios8备忘录安卓版下载,ios8备忘录app软件下载安卓版 v3.0-开心路...
  5. C1能力认证考试训练任务01-进制与信息编码
  6. sprintf函数的使用方法
  7. 【saas公司案例】易快报与浦发云资金
  8. 数字化转型投入大、效果差,永洪BI如何帮助企业迈出数据应用第一步
  9. 华为路由器:AR真机忘记Console口密码的处理方法全过程演示
  10. Java -- 定时任务实现方式