【大数据】Flink 详解(十):SQL 篇 Ⅲ

Flink 详解》系列(已完结),共包含以下 10 10 10 篇文章:

  • 【大数据】Flink 详解(一):基础篇
  • 【大数据】Flink 详解(二):核心篇 Ⅰ
  • 【大数据】Flink 详解(三):核心篇 Ⅱ
  • 【大数据】Flink 详解(四):核心篇 Ⅲ
  • 【大数据】Flink 详解(五):核心篇 Ⅳ
  • 【大数据】Flink 详解(六):源码篇 Ⅰ
  • 【大数据】Flink 详解(七):源码篇 Ⅱ
  • 【大数据】Flink 详解(八):SQL 篇 Ⅰ
  • 【大数据】Flink 详解(九):SQL 篇 Ⅱ
  • 【大数据】Flink 详解(十):SQL 篇 Ⅲ

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

Flink 详解(十):SQL 篇 Ⅲ

  • 102.Flink CDC 了解吗?什么是 Flink SQL CDC Connectors?
  • 103.Flink CDC 原理介绍一下
  • 104.通过 CDC 设计一种 Flink SQL 的 ETL 一体化的实时数仓
  • 105.Flink SQL CDC 如何实现一致性保障(源码分析)
  • 106.Flink SQL GateWay 了解吗?
  • 107.Flink SQL GateWay 创建会话讲解一下?
  • 108.Flink SQL GateWay 如何处理并发请求?多个提交怎么处理?
  • 109.如何维护多个 SQL 之间的关联性?
  • 110.SQL 字符串如何提交到集群成为代码?

102.Flink CDC 了解吗?什么是 Flink SQL CDC Connectors?

在 Flink 1.11 引入了 CDC 机制,CDC 的全称是 Change Data Capture,用于捕捉数据库表的增删改查操作,是目前非常成熟的同步数据库变更方案。

Flink CDC Connectors 是 Apache Flink 的一组源连接器,是可以从 MySQL、PostgreSQL 数据直接读取全量数据和增量数据的 Source Connectors,开源地址:https://github.com/ververica/flink-cdc-connectors。

目前(1.13 版本)支持的 Connectors 如下:

在这里插入图片描述
另外支持解析 Kafka 中 debezium-jsoncanal-json 格式的 Change Log,通过 Flink 进行计算或者直接写入到其他外部数据存储系统(比如 Elasticsearch),或者将 Changelog Json 格式的 Flink 数据写入到 Kafka。

在这里插入图片描述
Flink CDC Connectors 和 Flink 之间的版本映射:

在这里插入图片描述

103.Flink CDC 原理介绍一下

在最新 CDC 调研报告中,DebeziumCanal 是目前最流行使用的 CDC 工具,这些 CDC 工具的核心原理是 抽取数据库日志 获取变更。在经过一系列调研后,目前 Debezium(支持全量、增量同步,同时支持 MySQL、PostgreSQL、Oracle 等数据库),使用较为广泛。

Flink SQL CDC 内置了 Debezium 引擎,利用其抽取日志获取变更的能力,将 changelog 转换为 Flink SQL 认识的 RowData 数据。(以下右侧是 Debezium 的数据格式,左侧是 Flink 的 RowData 数据格式)。

在这里插入图片描述
RowData 代表了一行的数据,在 RowData 上面会有一个元数据的信息 RowKind,RowKind 里面包括了 插入+I)、更新前-U)、更新后+U)、删除-D),这样和数据库里面的 binlog 概念十分类似。

通过 Debezium 采集的数据,包含了旧数据(before)和新数据行(after)以及元数据信息(source),opu 表示是 update 更新操作标识符(op 字段的值 cudr 分别对应 createupdatedeleteread),ts_ms 表示同步的时间戳。

104.通过 CDC 设计一种 Flink SQL 的 ETL 一体化的实时数仓

设计图如下:

在这里插入图片描述

通过 Flink CDC Connectors 替换 Debezium + Kafka 的数据采集模块,实现 Flink SQL 的 ETL 一体化,以 MySQL 为 Source 源,Flink CDC 中间件为插件,ES、Kafka 或者其他为 Sink,这样设计的优点如下:

  • 开箱即用,简单易上手。
  • 减少维护的组件,简化实时链路,减轻部署成本。
  • 减小端到端延迟。
  • Flink 自身支持 Exactly Once 的读取和计算。
  • 数据不落地,减少存储成本。
  • 支持全量和增量流式读取。
  • binlog 采集位点可回溯。

105.Flink SQL CDC 如何实现一致性保障(源码分析)

Flink SQL CDC 用于获取数据库变更日志的 Source 函数是 DebeziumSourceFunction,且最终返回的类型是 RowData,该函数实现了 CheckpointedFunction,即通过 Checkpoint 机制来保证发生 failure 时不会丢数,实现 exactly once 语义,这部分在函数的注释中有明确的解释。

/**
 * The {@link DebeziumSourceFunction} is a streaming data source that pulls captured change data
 * from databases into Flink.
 * 通过Checkpoint机制来保证发生failure时不会丢数,实现exactly once语义
 * <p>The source function participates in checkpointing and guarantees that no data is lost
 * during a failure, and that the computation processes elements "exactly once".
 * 注意:这个Source Function不能同时运行多个实例
 * <p>Note: currently, the source function can't run in multiple parallel instances.
 *
 * <p>Please refer to Debezium's documentation for the available configuration properties:
 * https://debezium.io/documentation/reference/1.2/development/engine.html#engine-properties</p>
 */
@PublicEvolving
public class DebeziumSourceFunction<T> extends RichSourceFunction<T> implements
CheckpointedFunction,
ResultTypeQueryable<T> {}

为实现 CheckpointedFunction,需要实现以下两个方法:

public interface CheckpointedFunction {
	// 做快照,把内存中的数据保存在checkpoint状态中
	void snapshotState(FunctionSnapshotContext var1) throws Exception;
	
	// 程序异常恢复后从checkpoint状态中恢复数据
	void initializeState(FunctionInitializationContext var1) throws Exception;
}

接下来我们看看 DebeziumSourceFunction 中都记录了哪些状态。

/** Accessor for state in the operator state backend. 
    offsetState中记录了读取的binlog文件和位移信息等,对应Debezium中的
*/
private transient ListState<byte[]> offsetState;

/**
 * State to store the history records, i.e. schema changes.
 * historyRecordsState记录了schema的变化等信息
 * @see FlinkDatabaseHistory
*/
private transient ListState<String> historyRecordsState;

我们发现在 Flink SQL CDC 是一个相对简易的场景,没有中间算子,是通过 Checkpoint 持久化 binglog 消费位移和 schema 变化信息的快照,来实现 Exactly Once。

106.Flink SQL GateWay 了解吗?

Flink SQL Gateway 是 Flink 集群的 任务网关,支持以 RestAPI 的形式提交查询、插入、删除等任务,如下图所示:

在这里插入图片描述
总体架构如下图所示:

在这里插入图片描述

107.Flink SQL GateWay 创建会话讲解一下?

创建会话流程图如下:

在这里插入图片描述

  • 传入参数包含 name 名称、planner 执行引擎(Blink 或原生的 Flink)、executetypestreaming 或者 batch)、properties(配置参数,如并发度等)。
  • 在 SessionMnager 中,会根据这些参数创建对应的 SessionContext。
SessionContext sessionContext = new SessionContext(sessionName, sessionId, sessionEnv, defaultContext);
  • 将创建 Session 放入 Map 集合中,最后返回对应的 SessionId,方便后续使用。
sessions.put(sessionId,session); return sessionId;

108.Flink SQL GateWay 如何处理并发请求?多个提交怎么处理?

SQL GateWay 内部维护 SessionManager,里面通过 Map 维护了各个 Session,每个 Session 的任务执行是独立的。同一个 Session 通过 ExecuteContext 内部的 tEnvTableEnvironment)按顺序提交。

109.如何维护多个 SQL 之间的关联性?

在每个 Session 中单独维护了 tEnv,同一个 Session 中的操作其实是在一个 env 中执行的。因此只要是同一个 Session 中的任务,内部使用的 tEnv 就是同一个。这样就可以实现在一个 Session 中,先创建一个 view,然后执行一个 select,最后执行一个 insert

110.SQL 字符串如何提交到集群成为代码?

Session 中维护了 tEnv,SQL 会通过 tEnv 编译生成 Pipeline(即 DAG 图),在 batch 模式下是 Plan 执行计划;在 stream 模式下是 StreamGraph。然后 Session 内部会创建一个 ProgramDeployer 代码发布器,根据 Flink 中配置的 target 创建不同的 excutor。最后调用 executor.execute 方法提交 Pipeline 和 Config 执行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线上问题整理

JVM 案例 案例一&#xff1a;服务器内存不足&#xff0c;影响Java应用 问题&#xff1a; 收到报警&#xff0c;某Java应用集群中一台服务器可用内存不足&#xff0c;超过报警阈值。 排查过程&#xff1a; 首先&#xff0c;通过Hickwall查看该应用各项指标&#xff0c;发现无论…

kubeSphere DevOps部署vue项目

devops部署vue项目 &#x1f314;环境说明&#x1f30f;创建DevOps工程&#x1f30f;填写流水线信息&#x1f30f;创建流水线 &#x1f314;部署应用所需脚本JenkinsfileDockerfile &#x1f314;脚本一些参数如何设置说明&#x1f30f;deploy.yaml中的:imagePullSecrets:name属…

Velodyne 64E S3 硬件连接和 velodyne_driver ROS驱动安装

在当前的研究工作中&#xff0c;点云语义分割技术的应用显得尤为重要&#xff0c;而我选择了rangenet作为分割算法的核心。尽管课题组拥有一款80线激光雷达&#xff0c;但是在实际测试中&#xff0c;我们发现该算法模型在我们的数据集上的泛化表现并不理想。为了改善这一情况&a…

【进程调度】基于优先级的轮转调度C++实现算法

一、简介 1.1 背景 在计算机科学领域&#xff0c;进程调度是操作系统中一个关键的组成部分&#xff0c;它负责协调系统中各个进程的执行顺序&#xff0c;以最大程度地提高系统资源利用率。在这篇博客中&#xff0c;将深入探讨基于优先级的轮转调度算法&#xff0c;该算法结合…

数据结构第十四弹---链式二叉树基本操作(下)

链式二叉树 1、翻转二叉树2、判断两棵树是否相同3、判断二叉树是否是单值二叉树4、对称二叉树5、判断二叉树是否是平衡二叉树6、判断二叉树是否是另一棵二叉树的子树7、二叉树的销毁8、二叉树的深度遍历8.1、前序遍历8.2、中序遍历8.3、后序遍历 9、二叉树的构造和遍历总结 1、…

Mysql数据库高版本向低版本迁移方法

操作步骤 1、首先低版本Mysql创建数据库 2、使用navicat工具&#xff0c;复制高版本数据库的表 3、在低版本数据库中粘贴&#xff0c;弹出数据传输界面&#xff0c;选项去掉包含字符集、包含引擎及表类型 使用该版本实现了Mysql8.0向Mysql5.5的迁移&#xff0c;如果在Mysql8.0生…

海外融合CDN之火伞云

在当今互联网全球化的时代&#xff0c;出海业务已经成为许多企业的必然选择。在海外市场上&#xff0c;快速、稳定的内容传输对于企业的成功至关重要。然而&#xff0c;如何合理的运用多家CDN供应商的资源实现智能化的调度&#xff0c;以及如何与业务更紧密地结合起来&#xff…

华为手机备份全过程(保姆级问题解决方案)

手机备份 前言主体信息备份一、关闭windows安全中心的内存完整性二、开启 USB 调试&#xff0c;尝试使用 ADB 连接三、开始备份 微信备份QQ备份写在最后 前言 我的手机是荣耀 20&#xff0c;虽然不是华为&#xff0c;但系统还是鸿蒙的系统&#xff08;毕竟那阵荣耀还是华为的子…

P4学习(一) 环境搭建

系列文章目录 第一章 P4学习入门之虚拟机环境搭建 文章目录 系列文章目录前言一、P4是什么&#xff1f;二、搭建步骤1.下载虚拟机镜像2.虚拟机管理软件载入镜像2.1 找到你镜像的所在位置2.2 打开VMware Workstation2.3 载入镜像 3.检验环境是否配置成功 P4 的真机环境搭建 前言…

transfomer中Multi-Head Attention的源码实现

简介 Multi-Head Attention是一种注意力机制,是transfomer的核心机制. Multi-Head Attention的原理是通过将模型分为多个头&#xff0c;形成多个子空间&#xff0c;让模型关注不同方面的信息。每个头独立进行注意力运算&#xff0c;得到一个注意力权重矩阵。输出的结果再通过…

大模型背景下计算机视觉年终思考小结(一)

1. 引言 在过去的十年里&#xff0c;出现了许多涉及计算机视觉的项目&#xff0c;举例如下&#xff1a; 使用射线图像和其他医学图像领域的医学诊断应用使用卫星图像分析建筑物和土地利用率相关应用各种环境下的目标检测和跟踪&#xff0c;如交通流统计、自然环境垃圾检测估计…

国内首款支持苹果Find My芯片-伦茨科技ST17H6x

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…

PYTHON通过跳板机巡检CENTOS的简单实现

实现的细节和引用的文件和以前博客记录的基本一致 https://shaka.blog.csdn.net/article/details/106927633 差别在于,这次是通过跳板机登陆获取的主机信息,只记录差异的部份 1.需要在跳板机相应的路径放置PYTHON的脚本resc.py resc.py这个脚本中有引用的文件(pm.sh,diskpn…

代码随想录 Leetcode242. 有效的字母异位词

题目&#xff1a; 代码&#xff08;首刷看解析 2024年1月14日&#xff09;&#xff1a; class Solution { public:bool isAnagram(string s, string t) {int hash[26] {0};for(int i 0; i < s.size(); i) {hash[s[i] - a];}for(int i 0; i < t.size(); i) {hash[t[i]…

java编程解小学生一年级竞赛题

抖音教学视频 目录 1、题目三角形加起来为10 大纲 1、题目三角形加起来为10 连接&#xff1a;小学一年级数学竞赛练习题3套&#xff0c;有点难度&#xff01; 第16题 此方法不是最优解&#xff0c;穷举法&#xff0c;比较暴力解决 主要给大家演示如何用编程去解决我们的实…

智能寻迹避障清障机器人设计(电路图附件+代码)

附 录 智能小车原理图 智能小车拓展板原理图 智能小车拓展板PCB 智能小车底板PCB Arduino UNO原理图 Arduino UNO PCB 程序部分 void Robot_Traction() //机器人循迹子程序{//有信号为LOW 没有信号为HIGHSR digitalRead(SensorRight);//有信号表明在白…

vue3 - 自定义弹框组件

写了一个弹框组件 <template><transition name"modal-fade"><div v-if"showFlag" class"myModal"><div class"content"><div class"topBox"><div class"leftTitle"><spa…

Chapter 8 怎样使用类和对象(下篇)

⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ 8.2 对象数组 1.对象数组的每一个元素都是同类的对象 2.在建立数组时&#xff0c;同样…

day18【LeetCode力扣】19.删除链表的倒数第N个结点

day18【LeetCode力扣】19.删除链表的倒数第N个结点 1.题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&a…

SpringBoot+SSM项目实战 苍穹外卖(10) Spring Task WebSocket

继续上一节的内容&#xff0c;本节学习Spring Task和WebSocket&#xff0c;并完成订单状态定时处理、来单提醒和客户催单功能。 目录 Spring Task&#xff08;cron表达式&#xff09;入门案例 订单状态定时处理WebSocket入门案例 来单提醒客户催单 Spring Task&#xff08;cron…