Apache Flink Flink Time & Window 解析

2023-11-12

一、Window & Time 介绍

Apache Flink(以下简称 Flink) 是一个天然支持无限流数据处理的分布式计算框架,在 Flink 中 Window  可以将无限流切分成有限流,是处理有限流的核心组件,现在 Flink 中 Window 可以是时间驱动的(Time Window),也可以是数据驱动的(Count Window)。

 

下面的代码是在 Flink 中使用 Window 的两个示例

二、Window API 使用

从第一部分我们已经知道 Window 的一些基本概念,以及相关 API,下面我们以一个实际例子来看看怎么使用 Window 相关的 API。

 

代码来自 flink-examples

上面的例子中我们首先会对每条数据进行时间抽取,然后进行 keyby,接着依次调用 window(),evictor(), trigger() 以及 maxBy()。下面我们重点来看 window(), evictor() 和 trigger() 这几个方法。

2.1 WindowAssigner, Evictor 以及 Trigger

window 方法接收的输入是一个WindowAssigner, WindowAssigner 负责将每条输入的数据分发到正确的 window 中(一条数据可能同时分发到多个 Window 中),Flink 提供了几种通用的 WindowAssigner:tumbling window(窗口间的元素无重复),sliding window(窗口间的元素可能重复),session window 以及 global window。如果需要自己定制数据分发策略,则可以实现一个 class,继承自 WindowAssigner。

Tumbling Window

Sliding Window

Session Window

Global Window

evictor  主要用于做一些数据的自定义操作,可以在执行用户代码之前,也可以在执行用户代码之后,更详细的描述可以参考 org.apache.flink.streaming

.api.windowing.evictors.Evictor 的 evicBefore 和 evicAfter 两个方法。Flink 提供了如下三种通用的 evictor:

* CountEvictor 保留指定数量的元素

* DeltaEvictor 通过执行用户给定的 DeltaFunction  以及预设的 threshold,判断是否删除一个元素。

* TimeEvictor设定一个阈值 interval,删除所有不再 max_ts – interval 范围内的元素,其中 max_ts 是窗口内时间戳的最大值。

 

evictor 是可选的方法,如果用户不选择,则默认没有。

trigger 用来判断一个窗口是否需要被触发,每个 WindowAssigner 都自带一个默认的 trigger,如果默认的 trigger 不能满足你的需求,则可以自定义一个类,继承自 Trigger 即可,我们详细描述下 Trigger 的接口以及含义:

 

* onElement() 每次往 window 增加一个元素的时候都会触发

* onEventTime() 当 event-time timer 被触发的时候会调用

* onProcessingTime() 当 processing-time timer 被触发的时候会调用

* onMerge() 对两个 trigger 的 state 进行 merge 操作

* clear()  window 销毁的时候被调用

 

上面的接口中前三个会返回一个 TriggerResult,TriggerResult 有如下几种可能的选择:

* CONTINUE 不做任何事情

* FIRE 触发 window

* PURGE 清空整个 window 的元素并销毁窗口

* FIRE_AND_PURGE 触发窗口,然后销毁窗口

2.2 Time & Watermark

了解完上面的内容后,对于时间驱动的窗口,我们还有两个概念需要澄清:Time 和 Watermark。

 

我们知道在分布式环境中 Time 是一个很重要的概念,在 Flink 中 Time  可以分为三种Event-Time,Processing-Time 以及 Ingestion-Time,三者的关系我们可以从下图中得知:

Event Time、Ingestion Time、Processing Time

Event-Time 表示事件发生的时间,Processing-Time 则表示处理消息的时间(墙上时间),Ingestion-Time 表示进入到系统的时间。

 

在 Flink 中我们可以通过下面的方式进行 Time 类型的设置

env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime); // 设置使用 ProcessingTime

 

了解了 Time 之后,我们还需要知道 Watermark 相关的概念。

我们可以考虑一个这样的例子:某 App 会记录用户的所有点击行为,并回传日志(在网络不好的情况下,先保存在本地,延后回传)。A 用户在 11:02 对 App 进行操作,B 用户在 11:03 操作了 App,但是 A 用户的网络不太稳定,回传日志延迟了,导致我们在服务端先接受到 B 用户 11:03 的消息,然后再接受到 A 用户 11:02 的消息,消息乱序了。

 

那我们怎么保证基于 event-time 的窗口在销毁的时候,已经处理完了所有的数据呢?这就是 watermark 的功能所在。watermark 会携带一个单调递增的时间戳 t,watermark(t) 表示所有时间戳不大于 t 的数据都已经到来了,未来小于等于t的数据不会再来,因此可以放心地触发和销毁窗口了。下图中给了一个乱序数据流中的 watermark 例子

2.3 迟到的数据

 

上面的 watermark 让我们能够应对乱序的数据,但是真实世界中我们没法得到一个完美的 watermark 数值 — 要么没法获取到,要么耗费太大,因此实际工作中我们会使用近似 watermark  — 生成 watermark(t) 之后,还有较小的概率接受到时间戳 t 之前的数据,在 Flink 中将这些数据定义为 “late elements”, 同样我们可以在 window 中指定是允许延迟的最大时间(默认为 0),可以使用下面的代码进行设置

设置  `allowedLateness` 之后,迟来的数据同样可以触发窗口,进行输出,利用 Flink 的 side output 机制,我们可以获取到这些迟到的数据,使用方式如下:

需要注意的是,设置了 allowedLateness 之后,迟到的数据也可能触发窗口,对于 Session window 来说,可能会对窗口进行合并,产生预期外的行为。

3 Window 内部实现

在讨论 Window 内部实现的时候,我们再通过下图回顾一下 Window 的生命周期

每条数据过来之后,会由 WindowAssigner 分配到对应的 Window,当 Window 被触发之后,会交给 Evictor(如果没有设置 Evictor 则跳过),然后处理 UserFunction。其中 WindowAssigner,Trigger,Evictor 我们都在上面讨论过,而 UserFunction 则是用户编写的代码。

 

整个流程还有一个问题需要讨论:Window 中的状态存储。我们知道 Flink 是支持 Exactly Once 处理语义的,那么 Window 中的状态存储和普通的状态存储又有什么不一样的地方呢?

 

首先给出具体的答案:从接口上可以认为没有区别,但是每个 Window 会属于不同的 namespace,而非 Window 场景下,则都属于 VoidNamespace ,最终由 State/Checkpoint 来保证数据的 Exactly Once 语义,下面我们从 org.apache.flink.streaming.runtime.operators.windowing.WindowOperator 摘取一段代码进行阐述

从上面我们可以知道,Window 中的的元素同样是通过 state 进行维护,然后由 Checkpoint 机制保证 Exactly Once  语义。

 

至此,Time、Window 相关的所有内容都已经讲解完毕,主要包括为什么要有 Window; Window 中的三个核心组件:WindowAssigner、Trigger 和 Evictor;Window 中怎么处理乱序数据,乱序数据是否允许延迟,以及怎么处理迟到的数据;最后我们梳理了整个 Window 的数据流程,以及 Window 中怎么保证 Exactly Once 语义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache Flink Flink Time & Window 解析 的相关文章

  • #LeetCode刷题——350. 两个数组的交集 II

    难度 easy 1 题目介绍 2 思路分析 第一种方法 双指针法 先对俩个数组进行排序 使用俩个指针 i 和 j 不停遍历nums1和nums2 比较俩个元素的值 如果相等就增加到结果集中 如果 nums1 i lt nums2 j 将 i

随机推荐

  • CTF之流量分析之密码文件

    题目地址 BUUCTF在线评测 题目 深夜里 Hack偷偷的潜入了某公司的内网 趁着深夜偷走了公司的秘密文件 公司的网络管理员通过通过监控工具成功的截取Hack入侵时数据流量 但是却无法分析出Hack到底偷走了什么机密文件 你能帮帮管理员分
  • ACM PKU 1048 Follow My Logic

    ACM PKU 1048 Follow My Logic 2009 04 02 0 Comments Follow My Logic 题目重述 对于一个逻辑电路和给定的输入值 计算该电路的输出值 该逻辑电路有一个或多个输入端 零个或多个逻辑
  • AI笔记: Ubuntu下进行深度学习GPU环境的搭建

    Ubuntu系统安装 1 概述 网上教程一大堆 这里需要特别说明一些问题 目前对tensorflow和cuda支持最好的是ubuntu18 04 16 04这种LTS版本的 非LTS的一版不推荐 马上要到2020年的4月份了 可能会出现20
  • 操作系统常见面试题总结

    本文转载自 http blog csdn net lisuxuan 1993 article details 41794239 操作系统 知识点大纲 线程间通信 进程间通信 进程空间 内核态 用户态 多线程 锁 死锁的条件是什么 线程与进程
  • RTS与CTS的含义

    我是分割线首先介绍下网上看到的 一 RS232标准中的RTS与CTS RTS CTS 请求发送 清除发送 用于半双工时的收发切换 属于辅助流控信号 半双工的意思是说 发的时候不收 收的时候不发 那么怎么区分收发呢 缺省时是DCE向DTE发送
  • vue3+ts+elementui-plus二次封装树形表格

    复制粘贴即可 一 定义table组件
  • java utf-8 gbk_Java 字符转码之UTF-8转为GBK/GB2312

    java跟python类似的做法 在java中字符串的编码是java修改过的一种Unicode编码 所以看到java中的字符串 心理要默念这个东西是java修改过的一种Unicode编码的编码 packagestring importjav
  • 2020-09-06

    Memcache Memcached是一款开源 高性能 分布式内存对象缓存系统 可应用各种需要的缓存场景 其主要目的是通过降低对Database的访问来加速Web应用程序 他是一个基于内存的 键值对 存储 用于存储数据库调用 API调用或页
  • 关于mysql的时区(下):如何设置mysql的时区

    一 如何设置 mysql 时区 1 命令 1 查时区 show variables like time zone 返回有2行记录 要看time zone变量的值 不需要看system time zone 若值为SYSTEM表示取值跟syst
  • 【OpenStack实战—实验环境准备02】

    目录 前言 准备虚拟机 1 VMware workstation配置 2 控制节点虚拟机配置 3 计算节点虚拟机配置 4 存储节点虚拟机配置 一 配置静态IP IP规划 命令解释 二 关闭防火墙和selinux 命令解释 三 同步时间 命令
  • 独孤九剑第二式-Logistic回归模型

    文章适合于所有的相关人士进行学习 各位看官看完了之后不要立刻转身呀 期待三连关注小小博主加收藏 小小博主回关快 会给你意想不到的惊喜呀 文章目录 前言 Logistic回归模型理论讲解 Logistic引出 模型变换 构造最大似然函数 参数
  • IOTCS解决Actor异常报告、驱动优化

    近日 我们发布了 IOTCS0 8 版本 版本主要解决了Actor异常报告 解决消息处理问题 此外 新增南向驱动BACNet 修复了PLC驱动连接参数 实时监测驱动连接状态 统一的数据格式处理 与此同时我们对现有版本其它模块进行了功能优化
  • 三种安卓模拟器的安装和比较

    1 google官方的AVD 下载官方的sdk包 解压后用sdk manager 下载需要的android版本 如果android官网被墙 可以下载网上整理好的离线包 然后解压到相应目录下 也可以设置翻墙代理 然后运行avd manager
  • windows本地用docker调试

    使用doker调试code cd D project hello t 编译后的镜像名 docker build f D hello devops Dev Dockerfile build arg a hello t helloproject
  • BGP AnyCast

    什么是BGP AnyCast BGP anycast就是 利用一个 多个 as号码在不同的地区广播相同的一个ip段 利用bgp的寻路原则 短的as path 会选成最优路径 bgp寻路原则之n 从而优化了访问速度 其实bgp anycast
  • 【干货】虚拟对抗训练简介

    虚拟对抗训练是一种有效的正则化技术 在监督学习 半监督学习和无监督聚类方面取得了良好的效果 虚拟对抗训练已用于 提高监督学习绩效 半监督学习 深度无监督聚类 有几种正则化技术可以防止过度拟合 并有助于模型更好地概括出看不见的例子 正则化有助
  • Linux和UNIX“新手”们必备的与Linux系统编程相关的基本概念

    1 操作系统的核心 内核 术语 操作系统 通常包含两种不同含义 1 指完整的软件包 这包括用来管理计算机资源的核心层软件 以及附带的所有标准软件工具 诸如命令行解释器 图形用户界面 文件操作工具和文本编辑器等 2 在更狭义的范围内 是指管理
  • 用Android studio 2.3调度程序时提示“Installation failed with message Failed to establish session”错误,需要在在开发者选项

    用Android studio 2 3调度程序时提示 Installation failed with message Failed to establish session 错误 需要在在开发者选项里关闭MIUI优化
  • 【以太网硬件二十一】USXGMII是什么?-Part2

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 目录 PCS功能细节 XGMII到USXGMII的映射 带内配置和状态信号 自协商相关 电气特性 PCS功能细节 USXGMII把并行的X
  • Apache Flink Flink Time & Window 解析

    一 Window Time 介绍 Apache Flink 以下简称 Flink 是一个天然支持无限流数据处理的分布式计算框架 在 Flink 中 Window 可以将无限流切分成有限流 是处理有限流的核心组件 现在 Flink 中 Win