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

Flink 窗口触发器(Trigger)(一) Flink的窗口触发器(Trigger)是流处理中一个非常关键的概念,它定义了窗口何时被触发并决定触发后的行为(如进行窗口数据的计算或清理)。 阅读详情

窗口是flink处理无限流的核心,窗口将流拆分为有限大小的“桶”,我们可以在这些桶上进行计算。

1、Keyed vs Non-Keyed Windows

根据上游数据是否为Keyed Stream类型(是否将数据按照某个指定的Key进行分区),将窗口划分为Keyed Window和Non-Keyed Windows。两者的区别在于KeyStream调用相应的window()方法来指定window类型,数据会根据Key在不同的Task中并行计算,而Non-Keyed Stream需要调用WindowsAll()方法来指定window类型,所有的数据都会在一个Task进行计算,相当于没有并行。

1.1 Keyed Windows

stream
       .keyBy(...)               <-  keyed versus non-keyed windows
       .window(...)              <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/fold/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"

1.2 Non-Keyed Windows

stream
       .windowAll(...)           <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/fold/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"

2、窗口分配器

窗口分配器负责将一个事件分配给一个或多个窗口,内置窗口包括: 滚动窗口(Tumbling Windows)、滑动窗口(Sliding Windows)、会话窗口(Session Windows)、全局窗口(Global Windows),也可以通过继承WindowAssigner类来自定义窗口。

2.1 基于时间的窗口

Flink中所有的内置窗口(全局窗口除外)都有基于时间的实现,这个时间可以是事件时间(event time),也可以是处理时间(processing time)。其中,处理滚动窗口和滑动窗口的算子,在1.12版本之前使用timeWindow(),在1.12版本被标记为废弃,转而使用window()来作为窗口处理算子,这里只介绍最新版本的使用算子。

  • 滚动时间窗口(Tumbling Time Windows)
    滚动窗口将每一个事件分配给一个有特定大小的窗口,滚动窗口有固定大小,不会重叠。比如一个滚动窗口大小(window size)为5分钟。


    使用示例如下:

DataStream<T> input = ...;
// tumbling event-time windows
input
    .keyBy(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(5)))
    .<windowed transformation>(<window function>);
// tumbling processing-time windows
input
    .keyBy(<key selector>)
    .window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
    .<windowed transformation>(<window function>);
// daily tumbling event-time windows offset by -8 hours.
input
    .keyBy(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.days(1), Time.hours(-8)))
    .<windowed transformation>(<window function>);

由于Flink默认使用的时间基准是UTC±00:00时间,在中国需要使用UTC+08:00时间,所以最后一个示例中窗口大小为1天,时间偏移量就是8小时。

  • 滑动窗口(Sliding Time Windows)
    跟滚动窗口类似,滑动窗口也是将每一个事件分配给特定大小的窗口,且窗口有固定的大小,但它有一个窗口滑动的参数,标识一个窗口滑动的频率,或者说是每隔多久窗口滑动一次。比如一个窗口的大小为10秒钟,滑动频率为5秒。


    使用示例如下:

DataStream<T> input = ...;
// sliding event-time windows
input
    .keyBy(<key selector>)
    .window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5)))
    .<windowed transformation>(<window function>);
// sliding processing-time windows
input
    .keyBy(<key selector>)
    .window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5)))
    .<windowed transformation>(<window function>);
// sliding processing-time windows offset by -8 hours
input
    .keyBy(<key selector>)
    .window(SlidingProcessingTimeWindows.of(Time.hours(12), Time.hours(1), Time.hours(-8)))
    .<windowed transformation>(<window function>);

最后一个示例,中的Time.hours(-8)含义与滚动窗口一致。从滑动窗口的使用来看,滚动窗口其实是滑动窗口的一个特例,但窗口大小和滑动间隔相等的时候,滑动窗口就是一个滚动窗口。

  • 会话窗口(Session Windows)
    会话窗口按活动的会话对事件进行分组。与滑动窗口和滚动窗口相比,会话窗口没有固定的大小,也没有固定的起止时间,它是以一段时间没有接收到事件为窗口结束条件的。会话窗口分配器可以配置成一个固定的session gap,或者定义成一个session gap提取函数,在函数中定义一个不活跃的时长,一旦这个时长结束,当前会话就结束。


    使用示例如下:

DataStream<T> input = ...;
// event-time session windows with static gap
input
    .keyBy(<key selector>)
    .window(EventTimeSessionWindows.withGap(Time.minutes(10)))
    .<windowed transformation>(<window function>);
// event-time session windows with dynamic gap
input
    .keyBy(<key selector>)
    .window(EventTimeSessionWindows.withDynamicGap((element) -> {
        // determine and return session gap
    }))
    .<windowed transformation>(<window function>);
// processing-time session windows with static gap
input
    .keyBy(<key selector>)
    .window(ProcessingTimeSessionWindows.withGap(Time.minutes(10)))
    .<windowed transformation>(<window function>);
// processing-time session windows with dynamic gap
input
    .keyBy(<key selector>)
    .window(ProcessingTimeSessionWindows.withDynamicGap((element) -> {
        // determine and return session gap
    }))
    .<windowed transformation>(<window function>);

动态的会话gap需要实现SessionWindowTimeGapExtractor接口。

2.2 基于计数的窗口

基于计数的窗口是根据事件的个数来对窗口进行划分的,概念跟基于时间的滚动窗口差不多,只不过窗口大小的划分,有时间变成了事件的个数。

  • 滚动计数窗口(Tumbling Count Windows)

stream
      .keyBy(1)
      .countWindow(100) \\100为事件的个数,即窗口的大小
      .sum(1);
  • 滑动计数窗口(Sliding Count Windows)

stream
      .keyBy(1)
      .countWindow(100, 10) \\100为事件的个数,即窗口的大小,10为滑动的间隔
      .sum(1);

2.3 全局窗口(Global Windows)

全局窗口分配器将所有具有相同key的元素分配到同一个全局窗口中,这个窗口模式仅适用于用户还需自定义触发器的情况。否则,由于全局窗口没有一个自然的结尾,无法执行元素的聚合,将不会有计算被执行。

使用示例如下:

DataStream<T> input = ...;
input
    .keyBy(<key selector>)
    .window(GlobalWindows.create())
    .<windowed transformation>(<window function>);

3、触发器(Triggers)

触发器决定了一个窗口何时可以被窗口函数处理,每一个窗口分配器都有一个默认的触发器,如果默认的触发器不能满足你的需要,你可以通过调用trigger(...)来指定一个自定义的触发器。触发器的接口有5个方法来允许触发器处理不同的事件:

  • onElement()方法,每个元素被添加到窗口时调用
  • onEventTime()方法,当一个已注册的事件时间计时器启动时调用
  • onProcessingTime()方法,当一个已注册的处理时间计时器启动时调用
  • onMerge()方法,与状态性触发器相关,当使用会话窗口时,两个触发器对应的窗口合并时,合并两个触发器的状态。
  • 最后一个clear()方法执行任何需要清除的相应窗口

Flink有一些内置的触发器:

  • EventTimeTrigger(前面提到过)触发是根据由水印衡量的事件时间的进度来的
  • ProcessingTimeTrigger 根据处理时间来触发
  • CountTrigger 一旦窗口中的元素个数超出了给定的限制就会触发
  • PurgingTrigger 作为另一个触发器的参数并将它转换成一个清除类型
    如果你想实现一个自定义的触发器需要继承Trigger类

GlobalWindow默认的触发器是NeverTrigger,是永远不会触发的,因此,如果你使用的是GlobalWindow的话,需要定义一个自定义触发器。

4、驱逐器(Evictors)

Flink的窗口模型允许指定一个除了WindowAssigner和Trigger之外的可选参数Evitor,这个可以通过调用evitor(...)方法来实现。这个驱逐器(evitor)可以在触发器触发之前或者之后清理窗口中的元素。为了达到这个目的,Evitor接口有两个方法:

void evictBefore(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext);
void evictAfter(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext);

注:指定一个Evitor要防止预聚合,因为窗口中的所有元素必须得在计算之前传递到驱逐器中


 

flink 滚动窗口、滑动窗口、会话窗口、全局窗口   根据分配数据的规则,窗口的具体实现可以分为 4 类:滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)、会话窗口(Session Window),以及全局窗口(Global Window)  滚动窗口有固定的大小,是一种的划分方式。窗口之间没有重叠,也不会有间隔,是“首尾相接”的状态。滚动窗口可以基于时间定义,也可以基于数据个数定义;需要的参数只有一个,就是窗口的大小(window size)。   与滚动窗口类似,滑动窗口的大小也是固定的。区别在于,窗口之间并不是首尾 阅读详情

相关推荐

理解Flink窗口机制

如何理解窗口,如何使用窗口,如何设置水位线,如何优化窗口性能

u011345506的博客 1029

Flink窗口机制

文章目录 (一)窗口分类 (二) 一、窗口分类 键控窗口 和 非键控窗口 时间窗口 和 计数窗口 滑动窗口 和 滚动窗口 会话窗口 根据窗口不同的分类规则,大致可以分为上面几种。从上至下,更加具体。比如,键控窗口和非键控窗口都可以调定义时间窗口和计数窗口;而时间窗口和计数窗口,都可以定义滑动窗口和滚动窗口;另外,在时间窗口中,还有一个特例,就是会话窗口。 二、键控窗口 和 非键控窗口 根据在开窗之前,是否执行了 keyBy() 操作,分为 键控窗口 和 非键控窗口。 顾名思义,键控窗口,

Johnson8702的博客 2050

Flink四大基石之窗口(Window)使用详解

本文深入探讨 Flink 中高级 API 里窗口(Window)的相关知识,涵盖为什么需要窗口、其控制属性、应用代码结构、生命周期、分类,以及窗口函数的各类细节,并辅以实例进行讲解,旨在助力开发者透彻理解并熟练运用 Flink 的窗口机制处理流数据。

天冬忘忧的博客 2902

Flink的window机制

窗口分为两大类: - 基于时间的窗口 - 时间窗口以时间点到来定义窗口的开始(start)和结束(end),所以截取出的就是某一时间段的数据。到达时间时,窗口不再收集数据,触发计算输出结果,并将窗口关闭销毁 - 窗口大小 = 结束时间 - 开始时间 - 基于元素个数 - 基于元素的个数来截取数据,到达固定的个数时就触发计算并关闭窗口 - 只需指定窗口大小,就可以把数据分配到对应的窗口中

wt334502157的博客 1300

深入解析 Flink 中的时间与窗口机制

会话窗口常用于捕获用户活动等不规则数据窗口,比如在用户行为分析中,用户在网站上的一系列操作可以看作一个会话,当用户一段时间没有操作(如 10 分钟内无点击、浏览等行为),则认为该会话结束,对应的窗口关闭并进行数据计算,统计该会话内用户的操作次数、停留时间等指标。例如,设置一个每 5 秒生成一个包含 10 秒数据的窗口,滑动步长为 5 秒,那么第一个窗口包含 0 - 10 秒的数据,第二个窗口包含 5 - 15 秒的数据,两个窗口有 5 秒的数据是重叠的。以上内容详细介绍了 Flink 的时间与窗口机制。

_abab的专栏 1431

flink的窗口机制

目录 窗口分配器 时间窗口分为滑动窗口、滚动窗口 会话窗口 全局窗口(Global Windows) window的生命周期 当一个属于window的元素到达之后这个window就创建了,而当当前时间(事件或者处理时间)为window的创建时间跟用户指定的延迟时间相加时,窗口将被彻底清除。Flink 确保了只清除基于时间的window,其他类型的window不清除; 每一个windo...

zxl115_aojiao的博客 688

Flink窗口机制详解

Flink的窗口机制 6.1.1 窗口概述 窗口window是用来处理无限数据集的有限块。窗口就是把流切成了有限大小的多个存储桶bucket 流处理应用中,数据是连续不断的,因此我们不能等所有的数据来了才开始处理,当然也可以来一条数据,处理一条数据,但是有时候我们需要做一些聚合类的处理,例如:在过去的一分钟内有多少用户点击了网页。这种情况下,就适合定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口的数据进行计算。 6.1.2 窗口分类 基于时间的窗口(时间驱动) 基于元素的窗口(数据驱动) ke

qq_43523503的博客 3837

Flink 窗口分配器 WindowAssigner

Windows(窗口)是处理无限数据流的核心。窗口将流分解成有限大小的"桶",在上面可以进行各种计算。本文将重点介绍 Flink 中的窗口分配器 WindowAssigner。对于在 KeyedStream 上使用窗口,要做的第一件事就是为数据流指定 key,并且必须在定义窗口之前完成。直接调用keyBy()方法就可以将无限数据流拆分成 KeyedStream。在 KeyedStream 上,事件的任何属性都可以用作 key,如何指定 key 可以参阅。

SmartSi 958

Flink(二)窗口机制

Flink窗口机制是流式数据处理的核心组件,主要解决无界数据流的分段统计问题。文章系统介绍了窗口的分类(滚动/滑动/会话/计数窗口)、时间语义(事件/处理/摄取时间)及实现原理。详细阐述了窗口的五个关键组件:分组、窗口分配器、触发器、移除器和窗口函数,并提供了Java API示例。同时讲解了窗口生命周期、状态存储优化策略(如RocksDBStateBackend)和高级特性(迟数据处理、侧输出流)。最后指出窗口大小、水位线设置等注意事项,强调Flink通过分布式状态管理和增量计算实现高效窗口处理。

onlymscn的博客 1525

Flink窗口机制详解:大数据时间处理的核心

在大数据实时处理场景中,数据以流的形式持续产生,如何对无限数据流进行有限化处理是核心问题。Flink的窗口机制通过将数据流分割成有限的“窗口”,实现对窗口内数据的聚合、转换和计算。本文将系统讲解窗口机制的核心原理、实现细节、实战技巧及优化策略,覆盖从基础概念到高级应用的全流程。基础概念:定义窗口机制核心术语,对比不同时间语义技术原理:解析窗口类型、分配策略、触发机制及水位线算法实战指南:通过Python代码演示窗口配置与数据流处理应用场景:结合日志分析、实时监控等场景讲解落地经验。

操作系统内核探秘的博客 915

新手必看:电路设计里的‘地’到底怎么接?单点、多点、混合接地保姆级图解

本文深入解析电路设计中的接地技术,涵盖单点、多点和混合接地的原理与应用。通过详细的图解和实战案例,帮助新手理解接地在提供参考电位、构成电流回路及抑制电磁干扰中的关键作用,避免常见设计误区,提升电路稳定性与抗干扰能力。

weixin_28455801的博客 297

Flink 学习六 Flink 窗口计算API

窗口 window计算api 介绍

weixin_44244088的博客 1841

反无人机作战体系全解析:从低慢小探测到分层拦截

随着小型无人机在军事和民用领域的广泛使用,低慢小目标探测与拦截成为低空安全的核心挑战。传统防空体系面对成本低廉、飞行高度低、雷达特征小的无人机集群时,暴露出探测难、识别难、处置成本失衡等问题。为应对威胁,反无人机体系采用分层闭环设计,融合雷达、光电、声学与无线电侦测实现多源感知,通过电子战软杀伤与导弹、高炮、激光等硬杀伤手段协同配合,并借助自动化指控系统缩短“传感器到射手”的响应时延。该体系既可支撑战场要地防护,也能为民用低空安防提供参考。围绕分层反制逻辑,梳理探测、软硬杀伤、指控布防及实战短板,提供理解反

weixin_42533120的博客 333

Flink窗口详解

一、Window类型 1、时间窗口(TimeWindow) (1)滚动时间窗口(Tumbling Window) 将数据依据固定的窗口长度对数据进行切分 特点:时间对齐,窗口长度固定,没有重叠 (2)滑动时间窗口(Sliding Window) 滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成 特点:窗口长度固定,可以有重叠 (3)会话窗口(Se...

勇心在馨 3890

ISCE2+MintPy环境搭建实战:用Anaconda五分钟搞定InSAR处理全家桶

本文提供了一份详细的ISCE2+MintPy环境安装教程,旨在帮助InSAR处理初学者快速搭建开发环境。通过使用Anaconda创建虚拟环境并配置国内镜像,用户可在五分钟内一键安装ISCE2和MintPy全家桶,有效解决依赖冲突和版本兼容性问题,让用户能专注于数据处理本身。

2y3u4i5o6p的博客 1003

基于STM32的智能交通灯管理系统设计

本项目基于STM32微控制器设计了一个智能交通灯管理系统,通过多个传感器模块实现对交通灯的智能化控制。项目涉及硬件电路设计、传感器数据采集和逻辑控制实现,适用于城市交通路口或小区路口。该基于STM32的智能交通灯系统通过超声波传感器实现了流量监测,结合LED和蜂鸣器实现了自动交通信号控制,适用于城市或社区路口。基于STM32CubeMX生成的框架,编写红绿灯切换、流量监测和蜂鸣器控制的代码。以下为主循环,通过不断读取传感器数据,结合交通灯和蜂鸣器模块实现智能交通灯控制。

2401_88410555的博客 2062

Flink 的窗口机制

每隔固定的时间周期开启一个新的窗口。窗口之间不重叠。每收集固定数量的元素后触发一次窗口计算。不依赖时间,只依赖元素个数。窗口每隔一定时间“滑动”一次,窗口长度固定。窗口之间有重叠。每隔固定数量的元素滑动一次窗口,窗口长度也以元素个数为单位。窗口之间可以部分重叠。根据活动间隙(gap)来划分窗口。如果两个元素之间的时间差超过设定的 gap,则属于不同的窗口。窗口类型划分依据是否重叠触发条件示例滚动时间窗口时间否时间到达滚动计数窗口元素个数否数量达到。

╮(╯_╰)╭ Don't expect me to reply to you in time 974

基于强化学习的工业SCR脱硝系统控制算法设计与实现

本文提出了一种基于强化学习的工业SCR脱硝系统智能控制方法。针对SCR系统存在的非线性、大滞后和多变量耦合等控制难点,研究采用混合建模方法构建了精度在5%以内的系统模型,并设计了专门的强化学习环境。该方法通过定义合理的动作空间和状态空间,结合物理约束设计损失函数,利用深度强化学习算法优化氨喷射控制策略。相比传统PID控制,该智能控制器能更好地适应烟气参数波动,实现NOx排放的稳定控制,为工业环保设施提供了更优的自动化解决方案。

huanghm88的专栏 1456

flink的窗口

窗口是flink中重要的概念,为了方便高效的处理无界流,将数据切成有限的数据块进行处理;

天龙八部 2087

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

Robot_PLC_HMI_Automation 5687

线结构光相机原理详解以及精度控制总结

摘要:线阵结构光相机是工业三维检测的核心设备,结合线阵相机的高分辨率与结构光的主动三维成像能力。其工作原理基于线激光投射、逐线扫描、亚像素级条纹提取及三角测量法实现三维重建。精度受硬件、校准、环境和算法四因素影响,需通过优化硬件选型(如小像元相机、窄线宽激光)、精准校准(相机内参、激光平面)、环境控制(遮光、隔振、恒温)及算法优化(Steger算法、点云后处理)来提升。典型应用(卷材、轨道检测)中深度精度可达5-20μm,需根据场景需求平衡参数配置。

start_up_go的博客 939

Apache Flink窗口详解

Apache Flink 的核心功能之一是窗口处理,它允许开发人员以基于时间或基于计数的方式分组和处理数据流。窗口技术是一种根据某些标准将数据流划分为有限块(称为窗口)的技术。窗口(Window)是处理无界流的关键所在。窗口可以将数据流装入大小有限的“桶”中,再对每个“桶”加以处理。例如,您可以根据时间间隔(每 5 分钟)、事件计数(每 100 个事件)或会话边界(不活动间隙)定义窗口。在每个窗口内,您可以对数据进行各种操作,如聚合(总和、平均、计数)、转换(映射、过滤、连接)或复杂的业务逻辑。

喻师傅的学习笔记 1815

【WRFDA输入数据】全球高空观测气象数据(LITTLE_R 格式数据)

【WRFDA输入数据】全球高空观测气象数据(LITTLE_R 格式数据)

WW、forever的博客 476

Flink之Window窗口机制

在Apache Flink中,窗口是对无界数据流进行有界处理的机制。窗口可以将无限的数据流划分为有限的、可处理的块,使得可以基于这些有限的数据块执行聚合、计算和分析操作。

积跬步,至千里。 1988

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: Flink详解之七--状态管理
下一篇: Flink详解系列之五--水位线(watermark)
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值