CDC 數據實時同步入湖的技術、架構和方案(截至2024年5月的現狀調研)

在這里插入圖片描述

近期,對 “實時攝取 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.pswp.cn/bicheng/16720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16720.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis和MySQL的結合方式

Redis和MySQL的結合方式可以多樣化,以滿足不同的應用需求。以下是幾種常見的結合方式,以及它們的特點和適用場景: 緩存數據庫查詢結果: 應用程序首先嘗試從Redis中查詢數據。如果Redis中沒有所需數據,則從MySQL數據庫中…

ESP32-C6接入巴法云,Arduino方式

ESP32-C6接入巴法云,Arduino方式 第一、ESP32-C6開發環境搭建第一步:安裝arduino IDE 軟件第二步:安裝esp32庫第三:arduino 軟件設置 第二:簡單AP配網程序第一步:程序下載第二步:程序使用第三步…

電腦微信群發 500 1000人以上怎么群發,微信營銷群發助手軟件,本人親測,增加十倍業績!!!

今天給大家推薦一款我們目前在使用的電腦群發工具掘金小蜜,不僅可以無限多開,方便你同時管理多個賬號,群發功能更是十分強大,輕松釋放你的雙手。 掘金小蜜(只支持Win7及以上操作系統,沒有推Mac版和手機客戶…

[碼蹄集新手訓練營]MT1016-MT1020

目錄 題號MT1016 寬度與對齊MT1017 左右對齊MT1018 輸入寬度MT1020 %s格式符 題號 MT1016 寬度與對齊 #include<stdio.h> int main() { printf("%-5d %5d\n%-5d %5d\n%-5d %5d",455,455,-123,-123,987654,987654);return 0; }MT1017 左右對齊 #include<s…

Mac | macOs系統安裝Monuty解決外接u盤ntfs讀寫問題

問題 mac電腦的macOs系統無法將文件讀寫入外接u盤或硬盤中&#xff1b; 解決方案 安裝Monuty 官網&#xff1a;mounty官網 下載軟件 安裝其他配置 macbook:~ uwe$ brew install --cask macfuse macbook:~ uwe$ brew install gromgit/fuse/ntfs-3g-mac macbook:~ uwe$ brew…

【Vue】組件用法

【前言】 … 【目標】 1 了解組件間傳參 2 組件間自定義事件綁定與解綁 3 組件的事件總線,消息訂閱與發布的用法 4 組件插槽 一 組件間傳參 #mermaid-svg-CAQFgxRrMK5KRFOr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merma…

機頂盒也可以跑量--上機指南

一、背景介紹 隨著科技的進步和智能設備的普及&#xff0c;機頂盒已不再是單純的電視接收器&#xff0c;而是逐漸演變成為家庭娛樂中心。越來越多的機頂盒支持各種應用、游戲和功能&#xff0c;使得用戶可以在大屏幕上享受更多樣化的內容。本指南將帶你深入了解如何讓你的機頂…

Spring中如何配置和使用Properties文件?

在Spring框架中&#xff0c;.properties 文件通常用于存儲配置信息&#xff0c;如數據庫連接、服務地址、應用參數等。以下是配置和使用 Properties 文件的詳細步驟&#xff1a; 1. 創建 Properties 文件 在項目的 src/main/resources 目錄下創建一個 .properties 文件&#…

價格預言機領導者 Pyth 與 Eclipse 平臺集成,為高頻 DeFi 應用提供支持

本篇文章將對這一戰略合作伙伴關系&#xff0c;以及 Pyth 網絡在 Eclipse 生態系統中扮演的關鍵角色進行深入探討。 目前&#xff0c;Pyth 價格數據已正式上線于 Eclipse 測試網。Eclipse 是首個結合了以太坊安全性、Solana 性能和 Celestia DA 的 Solana虛擬機(SVM) Layer2 方…

Key Chain has stopped 是什么

Key Chain has stopped 是一個特定的錯誤消息&#xff0c;通常出現在Android設備上。這個錯誤提示意味著設備上的“Key Chain”服務出現了問題&#xff0c;Key Chain服務在Android中負責管理設備的安全密鑰和證書&#xff0c;包括用戶的隱私密鑰、應用簽名密鑰等。當這個服務意…

無線麥克風哪個牌子性價比高?揭秘領夾麥克風性價比最高品牌

隨著自媒體行業的興起&#xff0c;現在視頻直播或者是個人Vlog都越來越受歡迎了&#xff0c;要想做好內容&#xff0c;除了畫面之外&#xff0c;聲音效果同樣重要。而我們手機上自帶的麥克風&#xff0c;容易受環境影響&#xff0c;特別是在戶外或者拍攝距離較遠時&#xff0c;…

微軟改進WSL子系統 新版將支持鏡像宿主機網絡接口及使用外部DNS

Windows SubSystem for Linux (即 WSL) 是微軟在 Windows 10/11 中開發的子系統功能&#xff0c;該功能允許用戶在 Windows 上安裝 Linux 系統和相關環境&#xff0c;對開發者來說可以構建 Linux 開發環境進行工作。不過 WSL 系統在功能上也有不少缺點&#xff0c;典型的就是默…

【Docker實戰】進入四大數據庫的命令行模式

上一篇我們講了docker exec命令&#xff0c;這一次我們使用docker exec命令來進入四大數據庫的命令行模式。 我們進行游戲開發或軟件開發是離不開四大數據庫的&#xff0c;這四大數據庫分別是關系型數據庫mysql、postgres&#xff0c;nosql數據庫redis、mongodb。將它們容器化…

TopK問題

前言&#xff1a;本篇對TopK問題的解答是介于堆的基礎上講的 TopK問題&#xff1a; 就是在許多數據中找到前K個最大的數據或者最小的數據 比如&#xff1a;專業前10、世界五百強、富豪榜、以及游戲排行榜等等 對于TopK問題&#xff1a;能想到的最簡單直接的方式就是排序解決,…

fastadmin二次開發 修改默認的前端彈出樣式

需要修改fastadmin后臺默認的彈出提示樣式效果&#xff1a; 在項目里搜索這個關鍵詞&#xff1a;Toastr 首先這個文件&#xff0c;里面的success和error就是彈出提示的方法。 public/assets/js/fast.js 然后是下面這個文件&#xff1a; public/assets/js/require-form.js 你…

對于高速信號完整性,一塊聊聊啊(13)

前面一篇說了有源仿真和無源仿真的區別&#xff0c;今天介紹一下前仿真和后仿真。 一個完整的電路設計中必然包含前仿真和后仿真兩個部分&#xff0c;它們都屬于驗證的必要環節。 尤其是在復雜的芯片設計中&#xff0c;驗證要占用整個芯片設計流程時間的60%-70%。目的就是盡可…

快速搭建uni-app項目,vue2、Vue3與圖鳥UI組件封裝

大家好&#xff0c;我們團隊近期在uni-app開發領域取得了重要突破&#xff0c;特地向大家介紹一系列基于Vue 2、Vue 3和圖鳥UI的封裝組件&#xff0c;以及ucharts圖表的封裝。這些成果旨在幫助開發者們更加高效、便捷地構建uni-app項目。 一、Vue 2、Vue 3與圖鳥UI封裝組件 為…

解析氣膜場館造價—輕空間

隨著社會的發展和對環保及時間成本的重視&#xff0c;氣膜場館逐漸成為眾多體育場館的首選建筑模式。氣膜建筑包括氣膜籃球場、氣膜室內足球場、氣膜羽毛球場、氣膜乒乓球館、氣膜網球場以及氣膜滑冰場等&#xff0c;因其多項優勢受到廣泛應用。 氣膜場館的顯著特點 1. 氣膜場館…

H5 靜默獲取微信code

https://open.weixin.qq.com/connect/oauth2/authorize?appid*******&redirect_uri******&response_typecode&scopesnsapi_base&stateSTATE#wechat_redirect

基于springboot+vue2+mysql,不能添加重復數據的實現

1.后端代碼的實現&#xff1a; 1.1controller層 PostMapping("/save")public ResultData saveNotice(RequestAttribute Long _userId,RequestBody OperationMaintenance operationMaintenance ) throws IOException {try {operationMaintenanceService.saveData(_u…