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 实现。以下是大致的执行步骤:
- 逻辑计划生成:Flink SQL 的查询会首先被 Calcite 解析为逻辑计划。
- 优化和转化:逻辑计划经过优化器的优化,生成物理执行计划。对于流与流
JOIN,物理计划通常会包含窗口分配、状态管理、以及事件驱动的触发器等组件。 - 执行任务划分:物理执行计划会被拆分成多个并行任务,每个任务负责处理一部分流数据的
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 判断是否可以进行 JOIN。Watermark 机制允许处理一定范围的乱序数据,确保不会过早丢弃数据。
// 生成水印
Watermark watermark = new Watermark(currentEventTime - allowedLateness);
output.emitWatermark(watermark);
4. 优化策略
由于流与流的 JOIN 涉及状态管理和延迟处理,优化的主要目标是减少状态的存储压力并提高处理效率。
- 缩小窗口范围:通过限制窗口的大小,减少每个窗口内需要维护的状态数据量。
- 增量清理状态:使用 Flink 的
TTL功能,可以为状态设定生存时间,定期清理过期的状态。 - 减少延迟:通过优化水印的生成频率和延迟参数,减少乱序处理带来的延迟。
总结
Flink SQL 中的流与流 JOIN 是基于窗口和状态管理的复杂操作。通过维护两个流的键控状态,并结合事件时间和水印机制,Flink 可以处理无界数据流中的 JOIN 操作。底层通过窗口机制、状态存储以及异步事件驱动模型来处理流数据的匹配和关联。在实现中,状态的管理和清理、水印驱动的窗口触发、以及事件时间处理是核心所在。
相关文章:
FlinkSQL中 的 双流JOIN
在 Flink SQL 中,流与流的 JOIN 是一种复杂的操作,因为它涉及到实时数据的无界处理。理解 Flink SQL 流与流 JOIN 的底层原理和实现需要从多个角度来分析,包括 状态管理、事件时间处理、窗口机制 以及 内部数据流处理模型 等。下面将从这些角…...
Mysql(五) --- 数据库设计
文章目录 前言1.范式1.1.第一范式1.1.1 定义1.1.2.例子 1.2.第二范式1.2.1 定义1.2.2 例子1.2.3.不满足第二范式可能会出现的问题 1.3.第三范式1.3.1 定义2.3.2 示例 2. 设计过程3. 实体-关系图3.1 E-R图的基本组成3.2 关系的类型3.2.1 一对一关系(1:1)3.2.2 ⼀对多关系(1:N)3.…...
po框架的了解和应用
https://www.cnblogs.com/xiaolehong/p/18458470 笔记 任务:1、通过po框架输入测试报告 2、编写自动化测试框架 3、总结测试讲解稿 自动化测试框架概念: 自动化测试框架是一个集成体系,这个体系中包含测试功能的函数、测试数据源、测试对以及重要的模块。 作用:用于解决或…...
Linux云计算 |【第四阶段】RDBMS2-DAY5
主要内容: PXC概述、部署PXC(自动故障恢复测试)、存储引擎、读锁/写锁、表锁/行锁、常用的存储引擎介绍 一、PXC概述 PXC(Percona XtraDB Cluster,简称PXC集群),是基于Galera的MySQL高可用集群…...
从0开始深度学习(9)——softmax回归的逐步实现
文章使用Fashion-MNIST数据集,做一次分类识别任务 Fashion-MNIST中包含的10个类别,分别为: t-shirt(T恤)、trouser(裤子)、pullover(套衫)、dress(连衣裙&…...
Cannot inspect org.apache.hadoop.hive.serde2.io.HiveDecimalWritable 问题分析处理
报错; org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.UnsupportedOperationException: Cannot inspect org.apache.hadoop.hive.serde2.io.HiveDecimalWritable 该问题常见于parquet格式hive表查询时,一般原因为hive表对应数据文件元数据对应格式与…...
电子取证新视角:USB键盘流量提取密码方法研究与实现
0x01 引言 在当今数字化时代,USB设备的广泛使用使得信息安全和电子取证领域面临着新的挑战与机遇。特别是USB键盘,作为一种常见的输入设备,其流量中可能包含用户输入的敏感信息,如密码和其他私人数据。因此,研究USB键…...
Tongweb7049m4+THS6010-6012配置故障轉移+重試机制(by lqw)
使用场景 1.ths代理tongweb多套后端,假如有其中一套tongweb因为服务器重启或者宕机后没有及时启动,导致ths一直轮询在这个出故障的节点上。 2.即使在tongweb重启了,有的应用启动也需要一定的时间,这个时候只是启动了应用端口&…...
在线客服系统网站源码-网页聊天客服实现代码
源码简介 在线客服系统 – 网上客服系统,在线客服系统网站源码。 消息预知功能就是别人在聊天框打字你都能看到 1.新增客服坐席消息互动,客服之间可以互相接收消息,可以智能分配 2.新增消息预知功能,可提前预知访客已输入未发…...
JioNLP:一款实用的中文NLP预处理工具包
一、什么是 JioNLP? JioNLP是一个面向NLP开发者的工具包,提供了常见的中文文本预处理、解析等功能,使用简单、高效准确、无需配置,可极大加快NLP项目的开发进度。 主要特点包括: 代码开源,使用MIT协议功能丰富,涵盖多个NLP预处理需求使用简单,无需复杂配置即可调用准确高效…...
GR-ConvNet论文 学习笔记
GR-ConvNet 文章目录 GR-ConvNet前言一、引言二、相关研究三、问题阐述四、方法A.推理模块B.控制模块C.模型结构D.训练方法E.损失函数 五、评估A.数据集B.抓取评判标准 六、实验A.设置B.家庭测试物体C.对抗性测试物体D.混合物体 七、结果A.康奈尔数据集B.Jacquard数据集C.抓取新…...
windows环境批量删除指定目录下的全部指定文件
写在开头: 1. 涉及文件删除,先在小范围内测试(更改D:\扫描文件路径) 2. 命令会递归该目录下的所有文件 命令: forfiles /p D:\ /s /m _maven.repositories /c "cmd /c del path"解释: /p D:\ …...
水深探测仪的作用和使用方法
在水域救援的行动里,救援人员时刻面临着复杂多变、充满未知的水域状况。当接到救援任务奔赴现场,那片需要涉足的水域就像一个神秘莫测的异世界,挑战着所有人的认知与勇气。 水深探测仪作为一种专用于测量水域深度的设备,通过声波和…...
Leetcode 搜索插入位置
这段代码的核心思想是 二分查找,用于在一个已经排序的数组中查找目标值的位置。如果目标值存在于数组中,返回它的索引;如果目标值不存在,返回它按顺序应该插入的位置。 算法思想步骤: 定义左右边界: 我们使…...
jsp怎么实现点赞功能
在JSP中实现点赞功能通常涉及前端页面的设计、后端逻辑处理以及数据存储。为了实现点赞功能,你可以使用以下步骤: 前端(JSP页面)设计 前端部分包括显示点赞按钮,并通过Ajax发送点赞请求,以避免页面刷新。 …...
取消microsoft edge作为默认浏览器 ,修改方法,默认修改不了的原因
将Microsoft Edge或其它浏览器设置为默认浏览器,可以尝试以下方法来解决此问题: 一, 通过浏览器设置修改:打开Microsoft Edge浏览器,单击右上角的“更多”按钮,然后选择“设置”。在设置页面左侧找到“默认…...
C++面试速通宝典——17
283. Nginx负载均衡算法 Nginx支持多种负载均衡算法。 轮询(Round Robin):默认算法,按顺序逐个分配请求到后端服务器。加权轮询(Weighted Round Robin):与轮询类似,但…...
10、论文阅读:基于双阶对比损失解纠缠表示的无监督水下图像增强
Unsupervised Underwater Image Enhancement Based on Disentangled Representations via Double-Order Contrastive Loss 前言引言方法介绍解耦框架多尺度生成器双阶对比损失双阶对比损失总结损失函数实验前言 在水下环境中拍摄的图像通常会受到颜色失真、低对比度和视觉质量…...
Git配置token免密登录
配置token免密登录 如果不用ssh免密登录,还有其他基于Token那得免密登录方法吗? 2021年开始,github就不能使用密码登录git了,需要使用token作为密码登录,需要自己在setting中创建。 那么每次都需要我手动输入token密…...
活动预告|博睿数据将受邀出席GOPS全球运维大会上海站!
第二十四届 GOPS 全球运维大会暨研运数智化技术峰会上海站将于2024年10月18日-19日在上海中庚聚龙酒店召开。大会将为期2天,侧重大模型、DevOps、SRE、AIOps、BizDevOps、云原生及安全等热门技术领域。特设了如大模型 运维/研发测试、银行/证券数字化转型、平台工程…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
