如何基于Flink CDC与OceanBase构建实时数仓,实现简化链路,高效排查

本文作者:阿里云Flink SQL负责人,伍翀,Apache Flink PMC Member & Committer

众多数据领域的专业人士都很熟悉Apache Flink,它作为流式计算引擎,流批一体,其核心在于其强大的分布式流数据处理能力,同时巧妙地融合了流计算与批计算的能力,因此成为了众多企业在进行流式计算业务时的首选。

接下来,本文将探讨Flink CDC与Apache Flink之间的关联与差异。更重要的是,我们将如何巧妙地将Flink CDC与OceanBase数据库相结合,构建一个实时数据仓库系统。

Flink CDC和Apache Flink是什么关系?

从功能上来讲,Flink在批处理能力外,还能够实时读取数据源,进行数据加工,数据打宽和数据聚合,以及下游的存储、分析、服务。Flink CDC是基于Flink流式计算引擎构建的一个实时数据同步和处理的框架。目前,得益于日志变更技术(Change Data Capture),Flink CDC已经支持了十来种常见的数据库,比如MySQL、MongoDB、OceanBase等,在将数据实时同步至数据仓库或数据湖时,还能够实时进行数据加工、数据聚合、数据打宽等。

两个场景说明Flink CDC的由来

为什么会出现Flink CDC?下面以两个场景举例说明。

场景一:数据入仓。

传统的数据入仓方式,我们要通过数据同步工具将数据同步到数仓中分析,比如,使用DataX对业务数据库进行以天为单位的定时全量数据同步,但这种方式有几个比较明显的缺点。

首先,全量数据同步可能会对在线业务造成一定影响;其次,天级别的产出,可能无法满足下游业务的实时性需求。另外,随着数据量的不断增长,数据同步工具的性能瓶颈会越来越明显,比如同步的延时,以及对业务的影响。

很多应用方会在数据同步的基础上增设增量数据的同步,也就是我们常说的Lambda架构,常见的技术方案是采用Canal同步数据库增量数据到Kafka,再通过其他的处理框架将数据实时同步到新的数据库如OceanBase。这种架构虽然减少了对在线业务的影响,但引入了更多的组件,使同步链路变得更长。同时,手动管理全量和增量数据链路的切换也可能导致数据出现问题。

Flink CDC的出现很好地解决了上述问题,它能够一体化地支持全量数据和增量数据的读取,并且是在用户无感知的情况下自动发生的。在不影响业务稳定性的前提下,保证了实时流式传输与毫秒级数据更新。对于全量数据和增量数据的切换,Flink CDC能够保证数据的一致性,用户不用再担心数据丢失的问题。另外,从同步链路而言,需要维护的组件更少,降低了用户的维护成本与故障排查成本。

场景二:ETL数据分析

传统的数据分析链路是把业务数据,通过中间件同步到Canal,再使用Kafka对数据进行加工、计算。这种方案难以保证数据的一致性,其关键在于 Canal组件只支持同步增量数据,不支持同步历史数据。而数据的聚合统计等分析操作如果没有历史数据支撑,那么分析的结果也是有缺失的。

如果使用基于 Flink CDC 的 ETL 数据分析链路,就可以用Flink CDC简单替换如Canal和Kafka的组件。例如,我们现在需要将MySQL和 Postgres的表进行实时关联,再写入OceanBase。我们只需要用Flink CDC写三段SQL:一是定义MySQL实时订单表;二是定义Postgres实时产品表;三是定义Oceanbase结果表。然后用Flink的 Join 语法,实时关联订单和产品数据,并INSERT INTO 到OceanBase的结果表当中,就完成了两张表的实时打宽和关联。整个过程实时地将MySQL和 Postgres的全量数据和增量数据读出来,进行一致性关联后实时写入OceanBase。

Flink CDC的四个核心技术

上述两个场景中提到的功能,涉及FlinkCDC四个核心技术:

  • 全增量一体化读取技术
  • 动态表(Dynamic Table)
  • 连续查询(Continuous Query)
  • Changelog Mechanism

1. 全增量一体化的读取技术。

旧版本Flink CDC的数据库变更读取能力是基于 Debezium 实现的。Debezium 是一个类似于 Canal 的捕获数据库变更数据的类库,该类库提供了全量增量数据的一致性读取。但是该类库有两个核心问题。第一,Debezium使用了数据库的全局锁来保证全量数据和增量数据的一致性,但全局锁会导致数据无法写入,对在线业务造成影响。第二,Debezium只支持单并发读取,当海量数据要入仓时,耗时较长。如果全量数据同步失败,还需要进行重新读取,这会进一步拉长同步耗时。这非常影响系统的稳定性。

针对这些问题,我们在2.0版本迭代时提出了增量快照读取算法。第一,采用增量快照读取算法,无需加锁就能保证全量数据到增量数据的一致性,对业务影响降到最低。第二,将大表切片,切片之间可以并行读取,大幅提升海量数据入仓效率。最后,系统会追踪切片的读取进度,支持按照切片的粒度进行失败回滚,而无需全表重新读取,提升了大规模数据同步场景的稳定性。

2. 动态表(Dynamic Table)。

在读取端将CDC数据读取进来后,我们面对的问题是如何对它进行一致性的处理加工,此处就涉及Flink CDC的第二个核心技术——动态表。

一枚硬币有两面,数据库领域也是如此。动态表意味着数据会随着时间变化,我们在观测动态表时,表的所有变更都是数据流,流和动态表是同一事物的二象性。我们将变更流物化,就得到了一个动态表。我们去观测动态表上的变化,就得到了一个变更流。

1683345244

3. 连续查询(Continuous Query)。

连续查询和动态表是相辅相成的,当我们在动态表上定义连续查询,就会得到一个新的动态表。这从物理层面而言,产生了一段持续的CDC的流,这条流又可以通过下一个连续查询进行处理和加工,再产生新的动态表,从而编织起一个有分层的流式数仓。

1683345261

4. Changelog Mechanism。

业界有很多支持流处理的框架,但大多不支持处理CDC的数据,关键原因在于缺乏完整的Changelog数据处理机制。

什么是Changelog数据处理机制?举个例子,现在有一个单词的数据源,我们要对每个单词进行聚合,并且对获取到的词频再进行聚合。比如单词是Hello和World,经统计,我们得到Hello出现一次,World也出现一次,那么词频为1的单词有两个(即[cnt=1, freq=2])。这时,数据源中又出现一个Hello,那么Hello就出现了两次,第一个聚合节点会输出一条Hello=2的更新,经过词频聚合后,会输出词频为2的单词有1个(即[cnt=2, freq=1])。但这是结果表中的[cnt=1, freq=2]是错误的。词频为1的单词少了一个(Hello词频从2变成了1),所以cnt=2对应的freq应该为1才对。

1683345275

因此,我们引入数据处理机制修正错误结果,最终得到正确结果:[cnt=1,freq=1]。当Hello的出现次数从一次变成两次,我们会像传统数据库一样输出一个完整的更新前镜像和后镜像,也就是先输出旧数据的撤回消息-[Helo, 1],再输出新数据的新增消息+[Hello, 2]。撤回消息在到达聚合节点后,就会对cnt=1的 freq 做减一操作,得到[cnt=1, freq=1]。新增消息会对cnt=2的freq做加一操作,得到[cnt=2,freq=1]。可以看到该结果与批处理的结果一致。通过这种方式,能够保证CDC流处理语义的一致性。Changelog数据处理机制是保证 Streaming SQL 结果正确的关键机制,不需要用户感知,因为优化器会自动判断是否要输出和处理撤回消息(update_before)。

1683345380

如何基于Flink CDC与OceanBase构建实时数仓?

基于上文Flink CDC的四个核心能力,结合OceanBase,可以构建一个实时的数据仓库,具体怎么做,我们不妨先来了解传统的实时数仓方案。

传统的实时数据仓库基于流式队列方案构建,我们称之为Streaming MQ方案,是目前业界最典型、应用最广泛的方案。将MySQL的数据源同步到Kafka,构建一个ODS数据层,再进行数据打宽、数据清洗,变为DWD的数据层,然后进行聚合,形成一个ADS数据层,最后做数据加工,放进KV层供下游进行消费查询。由于整个过程中数据不可被分析,所以还会将数据同步到分析型数仓。

1683345400

Streaming MQ方案的优势在于实践经验非常丰富,层次分明,每一个组件的分工明确。但它的劣势也比较明显,比如链路复杂、数据冗余,由于涉及组件较多,排查问题时也非常困难。

因此,我们开始尝试新的构建方案——Streaming OLAP方案,既拥有流式队列的能力,又具备OLAP的处理、分析、查询能力。这一方面基于Flink CDC的核心技术,另一方面得益于OceanBase行列混存的HTAP特性,可以在一套系统中支持交易处理和复杂查询分析的能力。

举个例子,我们通过Flink CDC,把MySQL的全量数据和增量数据同步到OceanBase,形成一个ODS数据层供下游订阅。订阅的同时读取数据做加工和打宽,然后写入下游的OceanBase形成DWD数据层,通过聚合形成DWS数据层,此时就可以为用户提供查询服务和消费提供。

1683345413

Streaming OLAP方案的优势显而易见,一是避免了Streaming MQ方案的数据冗余问题,不需要再维护一个实时数仓,数据可复用,模型统一,架构简单。二是简化了链路,OceanBase替代了KV服务、分析服务、Kafka等组件。三是解决了排查困难的问题,因为OceanBase每一层都是可查、可更新、可修正的,比如,某一层的数据出现问题,可以直接排查该层的表数据并进行修正,排查更高效。

该套实时数仓方案依赖于两项关键能力:OceanBase的CDC读取能力、OceanBase的CDC写入能力。

1.OceanBase CDC读取的实现机制。

对于全量数据的同步,因为OceanBase兼容MySQL,所以我们可以基于JDBC完成全量数据的读取;增量数据读取方面,基于oblogproxy捕获binlog数据,在数据源,可以通过logproxy-client 订阅 oblogproxy 获取增量数据。因为OceanBase暂时不支持表锁,也不支持行级的binlog位点,所以在全量和增量切换时,只能保证at-least-once读取。也就是说在切换的过程中会多读取数据,不过,Flink 会自动去重,保证最终数据不重复、不丢失。

2.OceanBase CDC写入的实现机制。

由于OceanBase 兼容 MySQL 协议,支持 MySQL 5.6和MySQL 5.7 的绝大多数语法,因此在许多场景下可以将其视作 MySQL 使用,比如,作为 Flink 的目的端数据库,可使用 flink-jdbc-connector 基于 MySQL 协议来写入,支持插入、更新和删除。

OceanBase CDC的读取和写入将整个实时数仓多层之间的数据进行了流式串联。举个例子,我们需要对订单明细表进行聚合,写入DWS层的统计表中。获取每个店铺每天的销售量。只需要三段SQL就可以完成。

第一段命令是定义一个OceanBase CDC的数据源,他是一个来自于orders的表,有这样的一些字段。

1683345496

第二,使用FlinkCDC统计店铺销售额,将JDBC的表写入OceanBase的表中,形成了店铺指标的统计层。

1683345505

第三段命令实时读取订单明细层(dwd_orders)的全量数据和增量数据,并进行实时聚合、加工,写入下游的OceanBase中(dws_shops)。该 dwd_shops 表又可以由另一个Flink进行读取,再加工,形成下一层的结果表。从而构建起整个流式数仓的分层概念。

1683345518

Flink 与 Oceanbase 将全面集成

目前,Flink与数据源之间的集成,主要分成四个维度:源表、维表、结果表、元数据。

在与OceanBase的集成中:

  • 源表支持全量数据的读取、增量数据的读取,以及全增量一体化的读取,下一步我们希望支持Exactly-Once 的读取。
  • 数据处理和加工过程中最常见的动作是数据补全和数据打宽,在这方面,OceanBase下一步可以作为维表供Flink远程查询。
  • 在结果表方面,目前支持数据的实时写入和更新,还有宽表Merge。下一步我们计划支持DDL的实时变更同步及整库的数据同步。
  • 在元数据方面,OceanBase将对接Flink Catalog接口。用户填写OceanBase的地址及鉴权信息,OceanBase所有的库表都可以进行实时写入和查询,无需手动定义DDL。

通过这四个维度的集成,Flink结合OceanBase可以打造一站式的实时数仓体验,未来,Flink希望与OceanBase更进一步,进行全面集成。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

DHCP协议原理(网络协议)

DHCP简介 定义 DHCP(动态主机配置协议)是一种网络管理协议,能够自动为局域网中的每台计算机分配IP地址及其他网络配置参数,包括子网掩码、默认网关和DNS服务器等。这一机制极大简化了网络管理,尤其在大型局域网中&am…

李沐 过拟合和欠拟合【动手学深度学习v2】

模型容量 模型容量的影响 估计模型容量 难以在不同的种类算法之间比较,例如树模型和神经网络 给定一个模型种类,将有两个主要因素: 参数的个数参数值的选择范围 VC维 线性分类器的VC维 VC维的用处 数据复杂度 多个重要因素: 样…

信息安全数学基础(20)中国剩余定理

前言 信息安全数学基础中的中国剩余定理(Chinese Remainder Theorem,简称CRT),又称孙子定理,是数论中一个重要的定理,主要用于求解一次同余式组。 一、背景与起源 中国剩余定理最早见于我国南北朝时期的数学…

鸿蒙小技巧

1.子调用父的方法 子组件 父组件 2.使用emitter实现孙子传爷 孙子组件 import emitter from ohos.events.emitter;let event: emitter.InnerEvent {eventId: 1,priority: emitter.EventPriority.HIGH};let eventData: emitter.EventData {data: {"state": true,…

R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

随着数字农业和智慧农业的发展,基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

帧率和丢帧分析实践

一、识别丢帧 1、使用AppAnalyzer检测性能问题 首先使用AppAnalyzer工具进行性能问题检测,AppAnalyzer是DevEco Studio中提供的检测评分工具,用于测试并评价HarmonyOS应用或元服务的质量,能快速提供评估结果和改进建议,当前支持的…

Visual Studio 引入外部静态库与动态库

Windows Visual Studio 引入外部静态库与动态库 1.前言 在C开发中不可避免地要在自己的项目中引入外部库(OpenGL、OpenCV、OCC等),使用这些库都需要在项目中配置相应的属性才能正常开发编译。 2.引入 引入外部库主要引入三种文件&#xf…

C语言 | Leetcode C语言题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))int strongPasswordChecker(char * password) {int n strlen(password);bool has_lower false, has_upper false, has_digit false;for …

高质量的翻译:应用程序可用性和成功的关键

在日益全球化的应用市场中&#xff0c;开发一款优秀的产品只是成功的一半。另一半&#xff1f;确保你的用户&#xff0c;无论他们在哪里或说什么语言&#xff0c;都能无缝理解和使用它。这就是高质量翻译的用武之地——不是事后的想法&#xff0c;而是应用程序可用性和最终成功…

攻防世界---->ReverseMe-120

做题学习笔记。 前言&#xff1a;目前遇见的reverse都是&#xff0c;已知密文&#xff0c;去求解明文flag&#xff1b; 此题逆着来&#xff0c;通过明文&#xff0c;去求解密文flag。 base加密的识别&#xff0c;还算容易。 那么&#xff0c;base解码的识别呢&#xff1f; 攻…

Java调用数据库 笔记06 (修改篇)

1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类调用方法进行连接&#xff0c;得到连接对象 DriverManager.getConnection(url, user, password); 其中设置参数&#xff1a; static final String url "jdbc:my…

聊天组件 Vue3-beautiful-chat 插槽

前言 Vue3-beautiful-chat 组件有四个插槽可以定制 一、user-avatar(头像) 首先是头像插槽,我们可以直接在 <beautiful-chat></beautiful-chat> 中间使用; 作用: 我们可以在用户头像上添加自定义样式,比如添加节日边框、可以使用首字母作为头像。。。 …

《使用 LangChain 进行大模型应用开发》学习笔记(五)

前言 本文是 Harrison Chase &#xff08;LangChain 创建者&#xff09;和吴恩达&#xff08;Andrew Ng&#xff09;的视频课程《LangChain for LLM Application Development》&#xff08;使用 LangChain 进行大模型应用开发&#xff09;的学习笔记。由于原课程为全英文视频课…

kafka动态认证 自定义认证 安全认证-亲测成功

kafka动态认证 自定义认证 安全认证-亲测成功 背景 Kafka默认是没有安全机制的&#xff0c;一直在裸奔。用户认证功能&#xff0c;是一个成熟组件不可或缺的功能。在0.9版本以前kafka是没有用户认证模块的&#xff08;或者说只有SSL&#xff09;&#xff0c;好在kafka0.9版本…

【全网首发】2024华为杯数学建模ABCDEF选题方向+完整思路代码+数据集处理+可视化结果

2024华为杯研究生数学建模比赛ABCDEF选题分析 建议选哪道题&#xff1f; 点击链接加入群聊【2024华为杯数学建模助攻资料】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kxtS4vwn3gcv8oCYYyrqd0BvFc7tNfhV7&authKeyedQFZne%2BzvEfLEVg2v8FOm%2BWNg1V%2Fiv3H…

Apifox Mock使用教程

Apifox是一个功能强大的可视化接口文档管理工具&#xff0c;使用Apifox可以让接口Mock变得更简单容易。Apifox具有出色的Mock功能&#xff0c;不仅兼容Mock.js语法&#xff0c;同时提供Nunjucks 和自定义脚本支持&#xff0c;能够满足不同场景需求&#xff0c;为前端接口调试提…

Element 表格相关操作

数据和页面展示分离操作 <script setup> // 从Element Plus中导入需要的图标组件 import {Check,Delete,Edit,Message,Search,Star, } from element-plus/icons-vue // 导入Vue的ref和onMounted函数 import {ref,onMounted} from vue;// 使用ref创建一个响应式的use…

vue-使用refs取值,打印出来是个数组??

背景&#xff1a; 经常使用$refs去获取组件实例&#xff0c;一般都是拿到实例对象&#xff0c;这次去取值的时候发现&#xff0c;拿到的竟然是个数组。 原因&#xff1a; 这是vue的特性,自动把v-for里面的ref展开成数组的形式&#xff0c;哪怕你的ref名字是唯一的&#xff01…

Java集合(List篇)

List a.使用List i.最基础的一种集合&#xff0c;是一种有序列表&#xff0c;内部按照放入元素的先后顺序存放&#xff0c;每个元素都可以通过索引确定自己的位置。 ii.数组的删除和新增 iii.ArrayList集合的新增和删除。 iv.LinkedList&#xff08;链表式集合&#x…

Ceph 基本架构(一)

Ceph架构图 Ceph整体组成 Ceph 是一个开源的分布式存储系统&#xff0c;设计用于提供优秀的性能、可靠性和可扩展性。Ceph 的架构主要由几个核心组件构成&#xff0c;每个组件都有特定的功能&#xff0c;共同协作以实现高可用性和数据的一致性。 以下是 Ceph 的整体架构及其…