FlinkSQL中 的 双流JOIN

        在 Flink SQL 中,流与流的 JOIN 是一种复杂的操作,因为它涉及到实时数据的无界处理。理解 Flink SQL 流与流 JOIN 的底层原理和实现需要从多个角度来分析,包括 状态管理事件时间处理窗口机制 以及 内部数据流处理模型 等。下面将从这些角度进行详细的分析。

1. 流与流 JOIN 的挑战

在处理无界数据流时,JOIN 两个流面临的主要挑战包括:

  • 无界数据量:流数据源是无界的,无法像静态表那样一次性加载所有数据,因此需要处理无限的数据。
  • 事件时间处理:两个流中的数据可能来自不同的时间源,需要对齐事件时间。
  • 数据的延迟与乱序:流中的数据可能是乱序到达的,必须考虑延迟和乱序处理问题。
  • 状态管理:为了执行 JOIN 操作,Flink 需要为每个流维护中间状态。这些状态可能会非常大,如何有效地管理和清理状态是核心问题。

2. Flink SQL 流与流 JOIN 的原理

        Flink SQL 中的 JOIN 操作是基于 事件时间 或 处理时间,并且通常需要借助窗口来约束数据的范围。

2.1 窗口(Windowed JOIN)

        在大多数情况下,流与流的 JOIN 是基于时间窗口的,即只在特定的时间窗口内对两个流进行 JOIN 操作。窗口化的 JOIN 限制了需要维护的状态量,从而避免了无限状态增长的问题。

窗口 JOIN 的原理:

  • 两个输入流中的数据都会被分配到相同的时间窗口。
  • 对于进入相同窗口的数据,Flink 会根据 JOIN 条件匹配两边的数据并输出匹配结果。
  • 一旦窗口关闭(即窗口的时间到达水印),Flink 会清除该窗口的状态。

窗口的具体类型:

  • 滚动窗口(Tumbling Window):每个窗口长度固定,窗口之间没有重叠。
  • 滑动窗口(Sliding Window):窗口长度固定,但窗口之间可能有重叠。
  • 会话窗口(Session Window):窗口根据数据到达时间自动调整,有固定的间隙时间。
2.2 状态管理(State Management)

        Flink 中每个流的中间结果都需要保存为状态,流与流的 JOIN 需要维护两个流的状态。Flink 使用 状态后端(如 RocksDB 或 内存状态后端)来持久化这些状态,确保在故障恢复时可以继续处理。

  • 状态的关键特性
    • 键控状态:流与流的 JOIN 通常是基于某个键进行的,即两个流中都有相同的键来进行匹配。在 Flink 中,数据会被哈希分配到不同的并行子任务,每个子任务只需要维护与自己相关的数据子集。
    • 时间驱动的状态清理:为了防止状态无限增长,Flink 使用 水印(Watermark)来触发状态的清理。当水印到达某个窗口的结束时间时,Flink 会认为该窗口已经完成处理,删除与该窗口相关的状态数据。
2.3 水印(Watermark)与事件时间处理

流与流的 JOIN 通常依赖于 事件时间。为了处理乱序数据,Flink 引入了 水印 的概念。

  • 水印 表示一个时间标记,表明系统认为这个时间之前的数据已经到达。在处理两个流的 JOIN 时,Flink 会使用水印机制确保不会过早地处理或丢失乱序到达的数据。
  • 当水印超过窗口的结束时间时,系统认为该窗口内的数据已经全部到齐,因此可以开始进行 JOIN 操作。
2.4 JOIN 类型

Flink SQL 支持的流与流 JOIN 类型包括:

  • 内连接(INNER JOIN):只返回两个流中匹配的记录。
  • 左外连接(LEFT OUTER JOIN):返回左流中的所有记录,以及右流中与其匹配的记录(如果存在),没有匹配时用 NULL 填充。
  • 右外连接(RIGHT OUTER JOIN):与左外连接类似,但保留右流中的所有记录。
  • 全外连接(FULL OUTER JOIN):返回两个流中所有匹配和不匹配的记录,未匹配的部分用 NULL 填充。

3. Flink SQL 流与流 JOIN 的底层实现

        Flink SQL 的执行计划是通过 Calcite 解析生成的。流与流 JOIN 的底层实现是通过 Flink 的流处理引擎结合 状态管理 和 事件时间驱动的触发器 完成的。

3.1 物理执行计划

        Flink SQL 中的 JOIN 会被翻译成一个物理执行计划,底层依赖于 Flink 的 DataStream API 实现。以下是大致的执行步骤:

  1. 逻辑计划生成:Flink SQL 的查询会首先被 Calcite 解析为逻辑计划。
  2. 优化和转化:逻辑计划经过优化器的优化,生成物理执行计划。对于流与流 JOIN,物理计划通常会包含窗口分配、状态管理、以及事件驱动的触发器等组件。
  3. 执行任务划分:物理执行计划会被拆分成多个并行任务,每个任务负责处理一部分流数据的 JOIN 操作。
3.2 底层代码实现
  • 状态存储:Flink 在 JOIN 过程中会为每个键分配状态存储。对于每个流的数据,Flink 会将其临时存储在键控状态中,直到匹配到另一个流中的相应数据。

    // Flink 中状态保存的示例
    ValueState<StreamRecord> leftState = getRuntimeContext().getState(new ValueStateDescriptor<>("leftState", StreamRecord.class));
    ValueState<StreamRecord> rightState = getRuntimeContext().getState(new ValueStateDescriptor<>("rightState", StreamRecord.class));
    
  • 事件时间处理:Flink 会使用水印(Watermark)来触发窗口关闭和状态清理。当水印超过窗口结束时间时,触发 JOIN 操作并清理状态。

    if (context.currentWatermark() >= windowEnd) {// 触发 JOIN 并清理状态processJoin(leftState, rightState);leftState.clear();rightState.clear();
    }
    
  • 异步 JOIN 触发:Flink 的处理是事件驱动的,即当某个流中有新的事件到达时,可能触发状态的匹配和输出。

3.3 Watermark 机制

        Flink 使用 Watermark 来处理乱序数据。每当数据流中到达新的事件时,Flink 会根据当前的 Watermark 判断是否可以进行 JOINWatermark 机制允许处理一定范围的乱序数据,确保不会过早丢弃数据。

// 生成水印
Watermark watermark = new Watermark(currentEventTime - allowedLateness);
output.emitWatermark(watermark);

4. 优化策略

        由于流与流的 JOIN 涉及状态管理和延迟处理,优化的主要目标是减少状态的存储压力并提高处理效率。

  • 缩小窗口范围:通过限制窗口的大小,减少每个窗口内需要维护的状态数据量。
  • 增量清理状态:使用 Flink 的 TTL 功能,可以为状态设定生存时间,定期清理过期的状态。
  • 减少延迟:通过优化水印的生成频率和延迟参数,减少乱序处理带来的延迟。

总结

        Flink SQL 中的流与流 JOIN 是基于窗口和状态管理的复杂操作。通过维护两个流的键控状态,并结合事件时间和水印机制,Flink 可以处理无界数据流中的 JOIN 操作。底层通过窗口机制、状态存储以及异步事件驱动模型来处理流数据的匹配和关联。在实现中,状态的管理和清理、水印驱动的窗口触发、以及事件时间处理是核心所在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的益农智慧服务平台【提供源码+答辩PPT+参考文档+项目部署】

一、项目技术架构&#xff1a; 本项目是一款SpringBoot益农平台的设计与实现。 该SpringBootVue的益农平台的设计与实现&#xff0c;后端采用SpringBoot架构&#xff0c;前端采用VueElementUI实现页面的快速开发&#xff0c;并使用关系型数据库MySQL存储系统运行数据。本系统分…

java-uniapp小程序-引导关注公众号、判断用户是否关注公众号

目录 1、前期准备 公众号和小程序相互关联 准备公众号文章 注册公众号测试号 微信静默授权的独立html 文件 2&#xff1a; 小程序代码 webview页面代码 小程序首页代码 3&#xff1a;后端代码 1&#xff1a;增加公众号配置项 2&#xff1a;读取公众号配置项 3&…

MySQL中查询语句的执行流程

文章目录 前言流程图概述最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;今天我们一起探讨一下执行一条查询的SQL语句在MySQL内部都发生了什么&#xff0c;让你对MySQL内部的架构具备一个宏观上的了解 流程图 概述 对于查询语句的SQL的执行流程&#xff0c;主要可以分为…

【Linux】<互斥量>解决<抢票问题>——【多线程竞争问题】

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

[Windows]文件搜索利器Everything(附zip)

前言 写代码过程中&#xff0c;老大突然发一条信息 老大&#xff1a;这周周报发一下。 我&#xff1a;好的。 然后我就 显示桌面打开-我的电脑找到E盘&#xff0c;找到周报文件夹寻找到所有周报中今天的周报复制发送 当我用上Everything之后 打开&#xff0c;输入周报copy发…

Oracle T5-2 ILOM配置

ILOM管理口ip地址配置 连接控制器&#xff08;SP&#xff09;串口&#xff08;RJ45)&#xff0c;进行系统设置 (缺省&#xff1a;9600&#xff0c;8-n-1&#xff0c;root/changeme) …………………. ORACLESP-AK02566506 login: root Password: Detecting screen size; pl…

Axure重要元件三——中继器

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 本节课&#xff1a;中继器 课程内容&#xff1a;认识中继器、中继器基本操作、中继器案例 应用场景&#xff1a;高级表单交互 一、认识中继器 我们不从理论视角去展示…

Android Framework AMS(05)startActivity分析-2(ActivityThread启动到Activity拉起)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS通过startActivity启动Activity的整个流程的整个流程的第二阶段&#xff1a;从ActivityThread启动到Activity拉起。 第一阶段文…

【Vue】Vue(八)Vue3.0 使用ref 和 reactive创建响应式数据

ref 创建&#xff1a;基本类型的响应式数据 **作用&#xff1a;**定义响应式变量。语法&#xff1a;let xxx ref(初始值)。**返回值&#xff1a;**一个RefImpl的实例对象&#xff0c;简称ref对象或ref&#xff0c;ref对象的value属性是响应式的。注意点&#xff1a; JS中操作…

《拿下奇怪的前端报错》:1比特丢失导致的音视频播放时长无限增长-浅析http分片传输核心和一个坑点

问题背景 在一个使用MongoDB GridFS实现文件存储和分片读取的项目中&#xff0c;同事遇到了一个令人困惑的问题&#xff1a;音频文件总是丢失最后几秒&#xff0c;视频文件也出现类似情况。更奇怪的是&#xff0c;播放器显示的总时长为无限大。这个问题困扰了团队成员几天&…

Java项目-基于Springboot的应急救援物资管理系统项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

工业自动化为什么依赖光耦隔离器 --- 腾恩科技

光耦合器隔离器在工业自动化中必不可少&#xff0c;可确保信号传输&#xff0c;同时保护敏感电子设备和人员免受高压影响。选择合适的光耦合器隔离器取决于对操作环境和隔离要求的了解。本文将重点介绍在为工业应用选择光耦合器隔离器时需要考虑的关键因素。 光耦合器隔离器在工…

上传图片到github上,生成链接在Typora中使用(解决Typora的md文件在分享时的丢失问题)

上传图片到github上,生成链接在Typora中使用(解决Typora的md文件在分享时的丢失问题) 在GitHub上从操作 创建一个 GitHub 仓库: 登录 GitHub,创建一个新的仓库来存储图片。 生成 GitHub 令牌: 在 GitHub 中,前往“Settings” > “Developer settings” > “Pers…

AUTOSAR_EXP_ARAComAPI的5章笔记(12)

☞返回总目录 5.4.6 方法 骨架侧的服务方法是抽象方法&#xff0c;必须由继承骨架的服务实现子类进行重写。让我们来看一下我们服务示例中的 Adjust 方法&#xff1a; /*** 对于所有输出和非空返回参数* 生成一个包含非空返回值和/或输出参数的封装结构。*/ struct AdjustOu…

UE4 材质学习笔记08(雨滴流淌着色器/雨水涟漪着色器)

一.雨滴流淌着色器 法线贴图在红色通道和绿色通道上&#xff0c;那是法线的X轴和Y轴&#xff0c;在蓝色通道中 我有个用于雨滴流淌的蒙版&#xff0c;在Alpha通道中&#xff0c;有个时间偏移蒙版。这些贴图都是可以在PS上制作做来的&#xff0c;雨滴流淌图可以直接用笔刷画出来…

永恒之蓝漏洞

MS17-010是微软于2017年3月发布的一个安全补丁&#xff0c;旨在修复Windows操作系统中的一个严重漏洞&#xff0c;该漏洞被称为“永恒之蓝”&#xff08;EternalBlue&#xff09;。这个漏洞影响了Windows的Server Message Block&#xff08;SMB&#xff09;协议&#xff0c;允许…

Java集合剖析3】ArrayList

目录 拓展 1. 在面试时如何讲解一个集合的底层&#xff1f; 2. IDEA如何查看底层源码&#xff1f; 一、ArrayList底层数据结构 二、插入方法的具体实现 三、ArrayList底层原理总结 拓展 1. 在面试时如何讲解一个集合的底层&#xff1f; 底层的数据结构。插入方法的具体实现。…

vue综合指南(六)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:vue综合指南 目录 101、Vue 框架怎么实现对象和数组的监听&#xff1f; 102、Proxy 与 Object.d…

10 分钟使用豆包 MarsCode 帮我搭建一套后台管理系统

以下是「 豆包MarsCode 体验官」优秀文章&#xff0c;作者把梦想揉碎。 十分钟使用豆包 MarsCode 搭建后台管理项目 在这个快节奏的时代&#xff0c;开发者们总是希望能够快速、高效地完成项目的搭建与开发工作。无论是初创企业还是大型公司&#xff0c;后台管理系统都是必不可…

SpringBoot1~~~

目录 快速入门 依赖管理和自动配置 修改自动仲裁/默认版本号 starter场景启动器 自动配置 修改默认扫描包结构 修改默认配置 读取application.properties文件 按需加载原则 容器功能 Configuration Import ​编辑 Conditional ImportResource 配置绑定Configur…