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

【大数据】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 执行。

相关文章:

  • 源码编译FFmpeg4.3
  • 有趣的事,讲给有趣的人听
  • dns 域名解析
  • java常见面试题:如何使用Java进行单元测试?
  • ES6(ECMAScript 6.0)
  • Python 常用模块pickle
  • 什么是云服务器ECS及其优势、购买、使用方式和部署建议
  • 操作系统-操作系统的概念和功能
  • Harbor离线安装
  • 建筑垃圾处理行业分析:正在被越来越广泛的运用
  • NSSCTF Round# 16 Basic pwn方向题解
  • 【Spring Boot 3】【数据源】自定义多数据源
  • GPT实战系列-ChatGLM3管理工具的API接口
  • 浏览器深色模式
  • C++ OpenGL 3D Game Tutorial 2: Making OpenGL 3D Engine学习笔记
  • SegmentFault for Android 3.0 发布
  • [nginx文档翻译系列] 控制nginx
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JAVA多线程机制解析-volatilesynchronized
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux链接文件
  • Nacos系列:Nacos的Java SDK使用
  • nfs客户端进程变D,延伸linux的lock
  • SOFAMosn配置模型
  • spark本地环境的搭建到运行第一个spark程序
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • - 概述 - 《设计模式(极简c++版)》
  • 计算机在识别图像时“看到”了什么?
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端相关框架总和
  • 新版博客前端前瞻
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​520就是要宠粉,你的心头书我买单
  • ​secrets --- 生成管理密码的安全随机数​
  • #{}和${}的区别?
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (10)ATF MMU转换表
  • (C++17) optional的使用
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (笔试题)合法字符串
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (九)One-Wire总线-DS18B20
  • (十)c52学习之旅-定时器实验
  • (未解决)macOS matplotlib 中文是方框
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net MVC + EF搭建学生管理系统
  • .net 获取url的方法
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET单元测试