当前位置: 首页 > news >正文

38、Flink 的窗口触发器(Triggers)详解

Triggers
a)概述

Trigger 决定了一个窗口(由 window assigner 定义)何时可以被 window function 处理;每个 WindowAssigner 都有一个默认的 Trigger,如果默认 trigger 无法满足需要,可以在 trigger(...) 调用自定义的 trigger。

Trigger 接口提供了五个方法来响应不同的事件

  • onElement() 方法在每个元素被加入窗口时调用。
  • onEventTime() 方法在注册的 event-time timer 触发时调用。
  • onProcessingTime() 方法在注册的 processing-time timer 触发时调用。
  • onMerge() 方法与有状态的 trigger 相关。该方法会在两个窗口合并时,将窗口对应 trigger 的状态合并,比如使用会话窗口时。
  • clear() 方法处理在对应窗口被移除时所需的逻辑。

注意

  • 前三个方法通过返回 TriggerResult 来决定 trigger 如何应对到达窗口的事件,应对方案有以下几种:
    • CONTINUE: 什么也不做
    • FIRE: 触发计算
    • PURGE: 清空窗口内的元素
    • FIRE_AND_PURGE: 触发计算,计算结束后清空窗口内的元素
  • 上面的任意方法都可以用来注册 processing-time 或 event-time timer。
b)触发(Fire)与清除(Purge)

当 trigger 认定一个窗口可以被计算时,它就会触发,也就是返回 FIREFIRE_AND_PURGE;即让窗口算子发送当前窗口计算结果的信号,如果一个窗口指定了 ProcessWindowFunction,所有的元素都会传给 ProcessWindowFunction,如果是 ReduceFunctionAggregateFunction,则直接发送聚合的结果。

当 trigger 触发时,它可以返回 FIREFIRE_AND_PURGEFIRE 会保留被触发的窗口中的内容,而 FIRE_AND_PURGE 会删除这些内容, Flink 内置的 trigger 默认使用 FIRE,不会清除窗口的状态。

Purge 只会移除窗口的内容, 不会移除关于窗口的 meta-information 和 trigger 的状态。

c)WindowAssigner 默认的 Triggers

WindowAssigner 默认的 Trigger 足以应付诸多情况;比如,所有的 event-time window assigner 都默认使用 EventTimeTrigger。 这个 trigger 会在 watermark 越过窗口结束时间后直接触发。

GlobalWindow 的默认 trigger 是永远不会触发的 NeverTrigger,在使用 GlobalWindow 时,必须自定义一个 trigger。

当在 trigger() 中指定了一个 trigger 时, 实际上覆盖了当前 WindowAssigner 默认的 trigger;如果指定了一个 CountTriggerTumblingEventTimeWindows,窗口将不再根据时间触发, 而是根据元素数量触发。

d)内置 Triggers 和自定义 Triggers

Flink 包含一些内置 trigger。

  • EventTimeTrigger 根据 watermark 测量的 event time 触发。
  • ProcessingTimeTrigger 根据 processing time 触发。
  • CountTrigger 在窗口中的元素超过预设的限制时触发。
  • PurgingTrigger 接收另一个 trigger 并将它转换成一个会清理数据的 trigger。

如果需要实现自定义的 trigger,请查看抽象类 Trigger。

https://github.com/apache/flink/blob/release-1.19//flink-streaming-java/src/main/java/org/apache/flink/streaming/api/windowing/triggers/Trigger.java

相关文章:

  • html5网页-浏览器中实现高德地图定位功能
  • 生产制造边角料核算说明及ODOO演示
  • Adobe Bridge BR v14.0.3 安装教程 (多媒体文件组织管理工具)
  • LabelMe下载及关键点检测数据标注
  • 【全开源】海报在线制作系统源码(ThinkPHP+FastAdmin+UniApp)
  • STM32手写超频到128M函数
  • 嵌入式0基础开始学习 ⅠC语言(7)指针
  • 2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享
  • Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器
  • Vue3解决“找不到模块“@/components/xxx.vue”或其相应的类型声明”
  • Docker: exec命令浅析
  • Java核心: 脚本引擎和动态编译
  • 三种路由协议RIP,OSPF和BGP
  • Android Graphics 显示系统 - Android 14(U)编译/运行Surface绘图、多屏同显/异显示例
  • 专为汽车内容打造的智能剪辑解决方案
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • conda常用的命令
  • docker容器内的网络抓包
  • ES6语法详解(一)
  • EventListener原理
  • in typeof instanceof ===这些运算符有什么作用
  • Java深入 - 深入理解Java集合
  • JS基础之数据类型、对象、原型、原型链、继承
  • MobX
  • Object.assign方法不能实现深复制
  • Redux 中间件分析
  • Sass Day-01
  • Spring Boot快速入门(一):Hello Spring Boot
  • Spring声明式事务管理之一:五大属性分析
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 后端_MYSQL
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 硬币翻转问题,区间操作
  • ​flutter 代码混淆
  • ​字​节​一​面​
  • # 数仓建模:如何构建主题宽表模型?
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)windows配置JDK环境
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (三)c52学习之旅-点亮LED灯
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转载)从 Java 代码到 Java 堆
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .Net - 类的介绍
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .vue文件怎么使用_我在项目中是这样配置Vue的