flink中window窗口和时间以及watermark水印(代码片段)

LeoHan LeoHan     2023-03-09     731

关键词:

我们都知道,Flink的核心是流式处理,但同时也支持批处理,Flink底层是一个流式引擎,在这个上面实现了流处理和批处理,而窗口则是批处理的实现。

在Flink中window从大的分类上主要有三种:Time Window(根据时间)、Count Window(根据数据量)、Session Window(会话窗口)

窗口类型有如下两种:

  • Tumbling Window 滚动窗口,窗口之间的数据没有重叠
  • Sliding Window 滑动窗口,窗口之间的数据有可能重叠

Count Window

Count Window主要有两类:

  • Tumble Count Window:累积固定个数的数据就作为一个窗口,按照数据量来统计,不是按照时间,比如countWindow(100) 表示当窗口中的数据有100个的时候开始计算
  • Sliding Count Window: 累积固定个数的数据就作为一个窗口,超过指定数量个数数据开启新一个窗口计算,比如 coutnWindow(100,10)窗口大小是100,滑动间隔是10,每增加10个元素就会对前面的100个元素计算一次

Time Window

Time Window是根据时间对数据进行分组的,

  • Tumble Time Window: 在时间上按照给定的窗口大小切分窗口,窗口之间不会重叠
  • Sliding Time Window: 在时间上按照给定的窗口大小、滑动步长切分窗口,窗口之间可能会存在数据重叠

Session Window

session window意为会话窗口,与HTTP请求的session概念类似,当超过一段时间,窗口没有收到数据时,认为窗口结束,计算窗口内的数据,窗口之间数据不会重叠

对于TimeWindow,在Flink中有几个时间语义:
Flink中主要有如下三种时间语义:

  • Event Time ,数据自带的时间属性,使用这个语义时需要指定数据中哪个字段表示该时间同事必须设置WaterMark。使用Event Time时,数据可能是乱序的。在计算时,Flink会缓存窗口内的数据直到接收到WaterMark,WaterMark假设不会有更晚的数据到达,意味着在同一个时间窗口下,Flink会等待一个有限的时间,在一定程度上降低了计算结果的绝对准确性,并且增加了系统的延迟
  • Processing Time: 数据进入某个算子,算子开始执行时的系统时间,不需要WaterMark机制,只依赖当前节点的操作系统时间
  • Ingestion Time: 数据到达Flink Source的时间,从Source到下游的各个算子中可能有多个计算环节,任何一个算子处理速度的快慢可能影响下游算子的Processing Time,而 Ingestion Time定义的是数据流入Flink的时间,不会被下游算子处理速度影响,因此Ingestion Time通常是Event Time和Processing Time的一个折中方案,Ingestion Time不需要设置复Water Mark,也不需要太多缓存,延迟较低。

watermark水印

watermark一般是在Event Time语义下使用,我们知道,Event Time 是事件发生的时间,但是进入到Flink中并不一定按照EventTime顺序进入,导致窗口收到的时间会存在乱序问题,这种情况下,数据可能出现乱序和延迟情况,而WaterMark就是为了解决这个问题。
我们假设窗口为滚动窗口,窗口大小为1分钟,正常情况下,窗口如下:
窗口1 : [20212-08 08:00:00 , 20212-08 08:01:00)
窗口2: [20212-08 08:01:00 , 20212-08 08:02:00)
窗口3: [20212-08 08:02:00 , 20212-08 08:03:00)

如果有一条数据的时间时间为 20212-08 08:00:30 在 20212-08 08:01:15到达,这个时候窗口1在20212-08 08:01:00已经处理完了,按照正常情况下,这条数据会被丢弃。
采用WaterMark机制之后,比如设置MaterMark为延迟20秒,那么这时候窗口1要在 20212-08 08:01:20的是才会触发计算,相当于这个窗口等了20秒之后才触发计算,而在等待20s的时间内,如果在[20212-08 08:00 , 20212-08 08:01:00)在这延迟的20s能够到达,那么也会纳入窗口1的计算中。

在Flink中如果时间语义设置为Event Time:env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);的话必须设置WaterMark。

Flink中WaterMark生成方式有两种:

  • 周期性生成,一般每隔200ms生成一个WaterMark
  • 数据流中每个数据eventTime都产生一个watermark

flink和sentinel中计算当前时间所属的时间窗口算法(代码片段)

flink中:org.apache.flink.streaming.api.windowing.windows.TimeWindowpublicstaticlonggetWindowStartWithOffset(longtimestamp,longoffset,longwindowSize)//转载请标明链接:https://blog.csdn.net/wabiaoz 查看详情

flink的watermark和window介绍以及延迟数据的处理

...数据大量丢失,所以watermark的获取最好紧跟着source。二:Window2.1类型汇总窗口分为三种,timewindow、countwindow和自定义的window。timewindow还分为滚动窗口,滑动窗口和会话窗口,图中没有画出,比较常用的是滚动窗口。2.2 滚动... 查看详情

11.flink四大基石window窗口的分类flink提供了很多各种场景用的windowassigner基于时间的滚动和滑动基于时间的滚动和滑动窗口基于数量的滚动和滑动(代码片段)

...k1.12-2021黑马程序员贺岁视频的学习笔记11.Flink四大基石12.Window12.1.窗口的分类12.2.API12.2.1.window和windowAll12.2.2.API调用示例12.2.3.Flink提供了很多各种场景用的WindowAssigner12.3.代码演示–基于时间的滚动和滑动–掌握12.3.1.本地ubuntu下安... 查看详情

flink中的时间和窗口(代码片段)

目录6.3窗口(Window)6.3.1窗口的概念 6.3.2窗口的分类6.3.3窗口API概览6.3.4窗口分配器(WindowAssigners)6.3.5窗口函数(WindowFunctions)6.3窗口(Window)在流处理中,我们往往需要面对的是连续不断、无... 查看详情

会话窗口 flink

】会话窗口flink【英文标题】:Sessionwindowsflink【发布时间】:2020-06-1308:59:33【问题描述】:有人可以帮我了解flink中的窗口(会话)何时以及如何发生吗?或者样品是如何处理的?例如,如果我有连续的事件流流入,事件是应用... 查看详情

flink窗口window机制详解(代码片段)

...一个流式引擎,在上面实现了流处理和批处理。而窗口(window)就是从Streaming到Batch的一个桥梁。Flink提供了非常完善的窗口机制,这是我认为的Flink最大的亮点之一(其他的亮点包括消息乱序处理,和checkpoint机制)。本文我们... 查看详情

flink详解系列之六--窗口机制

...否将数据按照某个指定的Key进行分区),将窗口划分为KeyedWindow和Non-KeyedWindows。两者的区别在于KeyStream调用相应的window()方法来指定window类型,数据会根据Key在不同的Task中并行计算,而Non-KeyedStream需要调用WindowsAll()方法来指定windo... 查看详情

flink学习(十四)flink窗口时间和水位线(代码片段)

...个问题,这个特别的机制就是“水位线”。Flink的窗口和时间根据窗口数据划分的不同,目前Flink支持如下3种:滚动窗口,窗口数据有固定的大小,窗口中的数据不会叠加;滑动窗口,窗口数据有固定的大小,并且有生成... 查看详情

Apache Flink 两种类型的窗口,时间和“计数”窗口

...口,时间和“计数”窗口【英文标题】:ApacheFlinktwotypesofwindow,timeand"count"windows【发布时间】:2018-06-2315:27:49【问题描述】:我正在尝试将文件作为带有窗口的流来处理。这里是代码objectProgdefmain(args:Array[String]):Unit=org.apach... 查看详情

大数据开发-flink-窗口全解析(代码片段)

...是一个流式引擎,在上面实现了流处理和批处理。而Window就是从Streaming到Batch的桥梁。通俗讲,Window是用来对一个无限的流设置一个有限的集合,从而在有界的数据集上进行操作的一种机制。流上的集合由Window来划定... 查看详情

flink的窗口聚合操作(timecountwindow)(代码片段)

...的窗口Flink认为批处理是流处理的一个特例,而窗口window就是从流处理到批处理的一个桥梁,通常来讲窗口就是用来将无线数据流转换为优先数据集,从而在优先数据集上进行操作的一种机制,在flink当中支持基于... 查看详情

flink原理与实现:sessionwindow(代码片段)

在上一篇文章:Window机制中,我们介绍了窗口的概念和底层实现,以及Flink一些内建的窗口,包括滑动窗口、翻滚窗口。本文将深入讲解一种较为特殊的窗口:会话窗口(sessionwindow)。建议您在阅读完... 查看详情

flink原理与实现:sessionwindow(代码片段)

在上一篇文章:Window机制中,我们介绍了窗口的概念和底层实现,以及Flink一些内建的窗口,包括滑动窗口、翻滚窗口。本文将深入讲解一种较为特殊的窗口:会话窗口(sessionwindow)。建议您在阅读完... 查看详情

flink原理学习窗口和时间(代码片段)

Flink原理学习之窗口和时间文章目录Flink原理学习之窗口和时间一、Flink的时间类型二、Watermark三、Flink窗口机制Java、大数据开发学习要点(持续更新中…)一、Flink的时间类型Flink的时间语义分为三种:EventTime:即... 查看详情

flink原理学习窗口和时间(代码片段)

Flink原理学习之窗口和时间文章目录Flink原理学习之窗口和时间一、Flink的时间类型二、Watermark三、Flink窗口机制Java、大数据开发学习要点(持续更新中…)一、Flink的时间类型Flink的时间语义分为三种:EventTime:即... 查看详情

flink窗口和水位线(代码片段)

...一个核心,因为stream是流数据,而batch是批数据,window也是stream通往batch的一个转折,因为通过窗口可以实现批流一体什么是水位线个人理解:水位线是处理乱序数据或迟到数据的,如果和窗口一起使用的话,水... 查看详情

flinkwindow窗口算子(代码片段)

...总结自flink官方文档:窗口|ApacheFlink窗口#窗口(Window)是处理无界流的关键所在。窗口可以将数据流装入大小有限的“桶”中,再对每个“桶”加以处理。本文的重心将放在Flink如何进行窗口操作以及开发者如何... 查看详情

「flink」事件时间与水印(代码片段)

...取窗口的开始时间为以下代码:org.apache.flink.streaming.api.windowing.windows.TimeWindow/***Methodtogetthewindowstartforatimestamp.**@paramtimestampepochmillisecondtogetthewindowstart.*@paramoffsetTheoffsetwhichwindowstartwouldbeshiftedby.*@paramwindowSizeThesizeofthegeneratedwindows.*@... 查看详情