CDC 数据实时同步入湖的技术、架构和方案(截至2024年5月的现状调研)

news2024/12/23 16:29:17

在这里插入图片描述

近期,对 “实时摄取 CDC 数据同步到数据湖” 这一技术主题作了一系列深入的研究和验证,目前这部分工作已经告一段落,本文把截止目前(2024年5月)的研究结果和重要结论做一下梳理和汇总。为了能给出针对性的技术方案,我们收敛了一下话题,对一些技术选型做了限制,在数据库这一侧,主要以 MySQL 作为示例进行介绍和演示(理论上,PG 等其他主流数据库均可行),在数据湖这一侧,我们重点关注的是 Apache Hudi。

1. 方案架构


这一主题的技术架构基本上可以分为两个相对独立的部分:

  • 前半程:{ 数据库 => Kafka } 的 CDC 数据采集
  • 后半程:{ Kafka => 数据湖 } 的 CDC 数据写入

我们认为在链路上引入 Kafka 是很有必要的,这在架构上会有很大的弹性和灵活性,所以我们没有调研从数据库直接落地到数据库的相关方案。在这套方案的架构上,有一个显著的差异,或者说挑战:不管是前半程还是后半程,都有两种可能的模式:

  • 使用一个作业将整库 / 多表同步到 Kafka ,以及再使用一个作业读取 Kafka 数据并同时写入多张 Hudi 表
  • 一张表对应一个作业

如果是单表单作业模式,方案已经已经非常成熟了,但是这种模式不适合大中型场景,应用范围有限,应该说,最好的实现方式是:多表单作业,但目前来看,这实现起来确实有挑战,我们后文再详细介绍。

2. 技术堆栈


从技术选型上看,整个链路可能会包含这样几类组件:

  • CDC 数据采集组件:Flink CDC、Kafka Connect
  • Schema Registry组件:Confluent Schema Registry 或 不设置
  • Hudi 表数据写入组件:Flink Hudi Connector、HoodieMultiTableStreamer

除了搭配使用多个开源组件形成一套完整的解决方案外,还有一些一站式的解决方案,例如:阿里云实时计算Flink版的 CDAS 功能,开源工具 Dinky 的 MySQLCDC 整库到 Hudi 等

3. 关键差异


在整个链路中,我们需要考虑多个关键技术点的实现,评估它们的利弊,这些技术点包括:

  • 在 { 数据库 => Kafka } 的 CDC 数据采集过程中,是一张表对应一个作业,占用一个数据库链接还是整库 / 多表对应一个作业,占用一个数据库链接?
  • 在 { Kafka => 数据湖 } 的 CDC 数据写入过程中,是一个 Topic 对应一个作业还是多个 Topic 对应一个作业?
  • 在整个链路中是通过集成一个 Schema Registry 来注册并获取每张表的 Schema 信息?还是靠建表语句(Flink SQL)?或是类型推断?(Spark)

这些关键技术点叠加不同的技术组件会形成复杂多样的技术组合,并各有各的优缺点。

4. 值得期待的方案


个人认为:在仅依赖主流开源产品原生机制和特性的前提下,最值得期待的方案应该是:

Flink CDC ( API 整库 / 多表同步,分流写入多个 Topic ,集成 Schema Registry) => Kafka => HoodieMultiTableStreamer => Hudi

前半程的功能除了还不能和 Schema Registry 对接外,其他都已经实现,即使不能自动向 Schema Registry 自动注册 Schema,还可以手动注册,这不是一个 Block Issue;后半程的功能其实应该已经支持了,但是,截止当前最新版本 ( Hudi 0.14.1 ),HoodieMultiTableStreamer 在处理 Debezium CDC 数据时依然有问题,需要再等待一段时间。

这套方案值得期待的原因在于:后半程 CDC 数据写入 Hudi 表的工作依赖的是 Hudi 的原生组件 HoodieMultiTableStreamer ,尽管目前它还不成熟,但未来是很值得期待的,这比自己编写和维护解析 CDC 数据并写入 Hudi 表要明智的多。至于前半程 Flink CDC 是否会集成 Schema Registry,目前没有查到确切信息,但如前所述,没有也不会是很大的问题,无非是手动注册一个 Schema。不过从长远来看,Schema Registry 会在实时链路中扮演越来越重要的角色。

5. 当前的务实方案


在 HoodieMultiTableStreamer 工具完善之前的这段时间里,个人认为:在不引入任何第三方依赖的前提下,目前最为可靠和实用的解决方案应该是:

Flink CDC ( API 整库 / 多表同步,分流写入多个 Topic ) => Kafka => Flink Hudi Connector => Hudi

这一方案的优势在于:前半程是整库 / 多表同步,对数据库影响较小,后半程使用 Flink Hudi Connector 读取 Kafka 数据写入 Hudi 表,其中,在创建 Hudi 表时,使用 Flink SQL 的 create table ... with ... like ... 子句可以极大简化建表语句(建表其实就是提供 Schema 的过程),总体上的代码量并不大。这个方案不太完美的地方在于:从 Kafka => Hudi 还是要一张表对应一个 Flink 作业,不过,对于一般用户来说,这未必会带来很多麻烦。 这一方案具体实现代码已经在《Flink CDC 整库 / 多表同步至 Kafka 方案(附源码)》一文中给出。

此外,关于后半程 { Kafka => Hudi } 的写入还有一种实现方案:使用 Spark 的 foreachBatch 自行编程实现 Hudi 的多表写入,各个表的 Hudi 配置也是需要配置文件提供,至于 Schema 信息可以利用 Spark 的 Schema 推断自动生成,不必显式配置,但是这种方式多少是有些类型不安全的,本系列文章没有展开讨论,网上有现成方案可供参考。长远来说,个人还是更看好 HoodieMultiTableStreamer + Confluent Schema Registry 的组合。

6. 具体方案汇总


以下是近期研究和检验过的六个主要的解决方案及其它们的优势、不足和评价:

  • 《Flink CDC 整库 / 多表同步至 Kafka 方案(附源码)》
    • 优势
      • { 数据库 => Kafka } 只有一个作业,只占用一个连接
      • 多表公用一个 Topic 还是 一张表对应一个 Topic 可选
      • 使用 Flink SQL 的 create table ... with ... like ... 子句一定程度上简化了 Hudi 的建表工作
    • 不足
      • Kafka => Hudi 还是必须要一张表一个 Flink 作业
    • 评价
      • 实用,但还有提升空间
  • 《CDC 实时入湖方案:MySQL > Kafka Connect > Kafka & Schema Registry > Hudi ( Flink Connector ) 》
    • 优势
      • 前半程有 Schema Registry 参与,提供 Schema 的注册、获取和变更管理
    • 不足
      • { 数据库 => Kafka } 和 { Kafka => 数据湖 } 两端都是一张表一个作业/数据库连接
    • 整体评价
      • 整体链路完全打通,但只能应用于表数量不多的中小型场景
  • 《CDC 实时入湖方案:MySQL > Kafka Connect > Kafka & Schema Registry > Hudi ( HoodieMultiTableStreamer ) 》
    • 优势
      • 全程有 Schema Registry 参与,提供 Schema 的注册、获取和变更管理
    • 不足
      • { 数据库 => Kafka } 是一张表一个作业/数据库连接
      • 目前版本的 HoodieMultiTableStreamer 有缺陷
    • 评价
      • 整体链路尚未完全打通,需要等待 Hudi 的后续版本修复 Bug
  • 《CDC 实时入湖方案:MySQL > Flink CDC > Kafka & Schema Registry > Hudi ( Flink Connector ) 》
    • 优势
      • 前半程有 Schema Registry 参与,提供 Schema 的注册、获取和变更管理
    • 不足
      • { 数据库 => Kafka } 和 { Kafka => 数据湖 } 两端都是一张表一个作业/数据库连接
    • 评价
      • 整体链路完全打通,但只能应用于表数量不多的中小型场景
  • 《CDC 实时入湖方案:MySQL > Flink CDC > Kafka & Schema Registry > Hudi ( HoodieMultiTableStreamer ) 》
    • 优势
      • 全程有 Schema Registry 参与,提供 Schema 的注册、获取和变更管理
    • 不足
      • { 数据库 => Kafka } 是一张表一个作业/数据库连接
      • 目前版本的 HoodieMultiTableStreamer 有缺陷
    • 评价
      • 整体链路尚未完全打通,需要等待 Hudi 的后续版本修复 Bug
  • 《CDC 实时入湖方案:MySQL > Flink CDC > Kafka > Hudi》
    • 优势
      • 链路最简单,实现起来最容易
    • 不足
      • { 数据库 => Kafka } 和 { Kafka => 数据湖 } 两端都是一张表一个作业/数据库连接
    • 评价
      • 整体链路完全打通,但只能应用于表数量不多的中小型场景

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

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

相关文章

深入分析 Android Activity (六)

文章目录 深入分析 Android Activity (六)1. Activity 的权限管理1.1 在 Manifest 文件中声明权限1.2 运行时请求权限1.3 处理权限请求结果1.4 处理权限的最佳实践 2. Activity 的数据传递2.1 使用 Intent 传递数据2.2 使用 Bundle 传递复杂数据 3. Activity 的动画和过渡效果3…

照片处理软件哪个好?爆款图片编辑工具分享

照片处理软件哪个好?在数字时代,照片处理软件已经成为我们日常生活和工作中不可或缺的工具。无论是为了美化照片、修复旧照,还是进行专业的图像处理,都有各种软件可以满足我们的需求。以下是一些值得一试的照片处理软件&#xff0…

海山数据库(He3DB)代理ProxySQL使用详解:(二)功能实测

读写分离实测 ProxySQL官方demo演示了三种读写分离的方式:使用不同的端口进行读写分离、使用正则表达式进行通用的读写分离、使用正则和digest进行更智能的读写分离。最后一种是针对特定业务进行的优化调整,也可将其归结为第二种方式,下边分…

IO流:字节流 字符流 缓冲流详解

IO流:字节流 字符流 缓冲流详解 📚 【Java】IO流:字节流 字符流 缓冲流详解 📚摘要引言一、“流”的概念1. “流”的分类1.1 输入流和输出流1.2 字节流和字符流字节和字符的区别?为什么要有字符流? 1.3 节点…

爬虫实战教程:深入解析配乐网站爬取1000首MP3

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、实战前准备 1. 选择目标网站 2. 分析网页结构 三、爬虫工作流程详解 1. 发…

Web上机:JSP+Servlet+JDBC的交互流程

目录 需求与设计 基础需求: 项目结构: 项目逻辑: 运行图示: 代码实现 Login.jsp InsertServlet SelectServlet Table.jsp user mysql表结构 Web开发技术迭代速度日新月异,对于技术的更新往往是基于底层一…

Node.js笔记(万字总结)

目录 前言 1.node介绍与使用 1.1 Node介绍 1.2 node.js的优势 1.3 node的安装 1.4 检验是否成功安装 1.5 第一个应用 1.5.1 服务器代码 server.js 1.5.2 完整代码 1.5.3 运行 1.5.4 测试 2.获取参数 3.模块系统 1.模块介绍 2.xiaoyu.js 3.xiaoyu.js完整代码 4…

Midjourney 推出Style Tuner工具 ,统一风格,提升创作效率!

Midjourney 由前 Magic Leap 程序员大卫 - 霍尔茨(David Holz)构思,于 2022 年夏天推出,在独立消息应用 Discord 的服务器上吸引了超过 1600 万用户,并由一个小规模的程序员团队不断更新,推出了包括平移、扩…

重温!瑞幸崩盘时的狂欢,我的股票盈利170%,陆正耀资本局大起底

瑞幸咖啡 瑞幸2019年5月,仅用了18个月就完成了上市。 不到1年,2020年3月戏剧化反转,被爆造假 2019年净收入虚增21亿,2季度2.5亿,3季度7亿、4季度11.7亿。 2019年成本支出虚增13亿,2季度1.5亿元&#xf…

UE4/UE5像素流送云推流:多人访问不稳定、画面糊、端口占用多等

UE4/UE5想要实现网页访问,很多工程师会选择guan方的像素流送。但这个技术要求在模型开发初期就接入。对于一些已有UE模型是无法进行流化的。虽然也可以解决新UE模型的网页访问问题,但在实际的应用中,点量云流也收到很多反馈说,使用…

重生之 SpringBoot3 入门保姆级学习(02、打包部署)

重生之 SpringBoot3 入门保姆级学习(02、打包部署) 1.6 打包插件1.7 测试 jar 包1.8 application.properties 的相关配置 1.6 打包插件 官网链接 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-starte…

短视频矩阵系统4年独立开发正规代发布接口源码搭建部署开发

1. 短视频矩阵源码技术开发要求及实现流程: 短视频矩阵源码开发要求具备视频录制、编辑、剪辑、分享等基本功能,支持实时滤镜、特效、音乐等个性化编辑,能够实现高效的视频渲染和处理。开发流程主要包括需求分析、技术选型、设计架构、编码实…

专家解读 | NIST网络安全框架(2):核心功能

NIST CSF是一个关键的网络安全指南,不仅适用于组织内部,还可帮助管理第三方网络安全风险。CSF核心包含了六个关键功能——治理、识别、保护、检测、响应和恢复,以及与这些功能相关的类别和子类别。本文将深入探讨CSF核心的主要内容&#xff0…

大气走航VOCS监测

1. 什么是走航监测? 走航监测主要指驾驶移动监测车,在一定区域范围之内边行驶、边检测、边反馈。通过车载的质谱监测系统,对环境空气中的VOCs进行快速检测;通过检测出的污染物总浓度,描绘污染地图。环保部门从污染地…

wincc如何实现远程监控1200PLC

用户监控中心和PLC不在同一个地方,需要通过互联网远程能监控PLC的运行状况。PLC型号是西门子1200,远程监控电脑用WINCC组态。wincc如何实现远程监控1200PLC呢。WINCC的通讯协议都是局域网,不能通过互联网找到远端PLC并通讯。随着工业物联网发…

PyTorch中的模型创建

最全最详细的PyTorch神经网络创建~ 话不多说直接开始~ 神经网络的创建步骤 定义模型类,需要继承nn.Module定义各种层,包括卷积层、池化层、全连接层、激活函数等等编写前向传播,规定信号是如何传输的 可以用 torchsummary 查看网络结构&…

拼多多的一场机试 解题报告 | 珂学家

前言 拼多多的一场机试 解题报告 有需要机试辅导,可以私信我 机试题 D. 任务队列是否会死锁? 一个任务队列,长度为n 可以添加一个任务,长度为a可以获取一个任务,长度为b 如果存在一个状态点,即不能添加…

python 两个表格字段列名称值,对比字段差异

支持xlsx,xls文件,相互对比字段列 输出两个表格文件相同字段,置底色为绿色 存在差异的不同字段,输出两个新的表格文件,差异字段,置底色为红色 import pandas as pd from openpyxl import load_workbook from openpy…

简单易懂的 API 集成测试方法

简介:API 集成测试的重要性 API 集成测试是一类测试活动,用于验证 API 是否满足功能性、可靠性、性能和安全性等方面的预期要求。在多 API 协作的应用程序中,这种测试尤为紧要。 在这一阶段,我们不仅审视单个组件,还…