5分鍾搞定 MySQL 到 ClickHouse 寬表構建和同步-CloudCanal實戰


簡述

上一篇文章介紹了使用 CloudCanal 進行 MySQL 到 ElasticSearch 的寬表構建, 有蠻多朋友關注和嘗試使用,我們也在不斷迭代升級這個能力。

作為產品的通用功能,今天我們介紹下 MySQL -> ClickHouse 的寬表構建案例。

技術點

ClickHouse 表關聯之觴

ClickHouse 作為標准的列存數據庫,其特點相當鮮明,對於多維度數據聚合、篩選特別高效,對於列存面向計算的特點,用得相當不錯,包括但不限於以下特點

  • io 效率高
    • 列壓縮
    • 少數列數據存取io放大效應較小
  • 極致計算優化
    • 向量化
    • 利用 SSE 等 SIMD 指令集加速
    • 未來可選 AVX 512 等指令集優化
    • 未來對於計算卸載到 FPGA、GPU 較便利

但是 ClickHouse 對於數據關聯(join), 相比於其 多維聚合篩選 能力要弱一些。對於這個問題,我們覺得有必要通過 CloudCanal 的寬表能力,讓其適用性得到進一步提升。大寬表 + 突出的數據 多維聚合篩選 能力,幾乎等於交互式分析的殺手鐧。

操作示例

前置條件:

  • CloudCanal 社區版部署,參見 社區版安裝文檔

  • 准備好 MySQL 數據庫(本例使用 5.7 版本)和 ClickHouse 數據庫(本例使用 21.8.X 版本)

  • MySQL 上創建 1 張事實表(my_order)和 2 張維表 (user 、product)

     CREATE TABLE `my_order` (
       `id` bigint(19) NOT NULL AUTO_INCREMENT,
       `gmt_create` datetime NOT NULL,
      `gmt_modified` datetime NOT NULL,
      `product_id` bigint(20) NOT NULL,
      `user_id` bigint(20) NOT NULL,
      PRIMARY KEY (`id`)
     ) ENGINE=InnoDB AUTO_INCREMENT=1460 DEFAULT CHARSET=utf8;
    
    CREATE TABLE `product` (
      `id` bigint(19) NOT NULL AUTO_INCREMENT,
      `gmt_create` datetime NOT NULL,
      `gmt_modified` datetime NOT NULL,
      `name` varchar(255) NOT NULL,
      `price` decimal(20,2) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2719 DEFAULT CHARSET=utf8;
    
    CREATE TABLE `user` (
      `id` bigint(19) NOT NULL AUTO_INCREMENT,
      `gmt_create` datetime NOT NULL,
      `gmt_modified` datetime NOT NULL,
      `name` varchar(255) NOT NULL,
      `level` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2224 DEFAULT CHARSET=utf8
    
  • ClickHouse 上創建 1 張寬表 my_order , 並額外包含兩張維表相關數據

    • user_id (關聯user.id), user_name(對應user.name)
    • product_id(關聯product.id) ,product_name(對應product.name),product_price (對應product.price)
    CREATE TABLE trade.my_order
    (
       `id` Int64,
       `gmt_create` DateTime,
       `gmt_modified` DateTime,
       `product_id` Int64,
       `user_id` Int64,
       `user_name` Nullable(String),
       `product_name` Nullable(String),
       `product_price` Nullable(Decimal(20, 2))
     )
    ENGINE = ReplacingMergeTree
    ORDER BY id
    SETTINGS index_granularity = 8192
    

開發寬表代碼

打包

  • 進入工程目錄,使用命令進行打包

    % pwd
    /Users/zylicfc/source/product/cloudcanal/cloudcanal-data-process
    % mvn -Dtest -DfailIfNoTests=false -Dmaven.javadoc.skip=true -Dmaven.compile.fork=true clean package
    

自定義代碼包

  • 打包命令后,代碼包位於工程目錄下的 wide-table/target 目錄
    截屏2021-12-10 下午12.30.39.png

添加數據源

  • 登錄 CloudCanal 平台
  • 數據源管理->新增數據源
  • MySQLClickHouse 分別添加
    截屏2021-12-16 下午6.33.14.png

任務創建

  • 任務管理->任務創建
  • 選擇 目標 數據源
  • 選擇 數據同步,並勾選 全量數據初始化, 其他選項默認
  • 選擇需要遷移同步的表, 此處只要選擇事實表即可,維表會通過自定義代碼反查補充
    截屏2021-12-16 下午7.07.18.png
  • 選擇列,默認全選,%(#ea1f1f)[選擇上傳代碼包(路徑如上所示)]
    截屏2021-12-16 下午7.07.45.png
  • 確認創建,並自動運行
    截屏2021-12-16 下午7.12.16.png

校驗數據

  • 變更事實表數據
    截屏2021-12-16 下午7.08.18.png
    截屏2021-12-16 下午7.08.50.png
  • 變更維表數據
    截屏2021-12-16 下午7.09.17.png
    截屏2021-12-16 下午7.09.42.png

數據變化規律

  • 事實表插入,更新都會反查維表最新數據並寫入對端
  • 維表更新,需要觸發事實表更新才能帶上最新的維表變更數據寫入對端
  • 維表數據刪除,如果觸發事實表更新,默認將會把對應的維表數據(已刪除)置為null

常見問題

維表變化后怎么辦?

維表變化不會直接觸發事實表更新。需要源端觸發事實表更新(比如變更一個時間字段),帶上最新的維表數據進行對端數據刷新。

另外對於維表數據的刪除,如果觸發事實表更新從而刷新對端數據,則默認置為null。

不會開發 java 代碼怎么辦?

如果能打包不會 java 開發,在 cloudcanal-data-process 尋找相應模版,修改配置即可。

如果不能打包也不會開發,找 CloudCanal 同學協助。

如果遇到出錯或者問題怎么辦?

如果會 java 開發,建議打開任務的 printCustomCodeDebugLog 觀察輸出的數據是否符合預期,如果不符合預期,可以打開任務的 debugMode 參數,對數據轉換邏輯進行調試。

如果不會 java 開發, 找 CloudCanal 同學協助。

還支持其他數據源么?

這個是 CloudCanal 通用能力,只要源和目標之間實現了全量遷移和增量同步,即支持。

總結

本文簡單介紹了如何使用 CloudCanal 進行 MySQL -> ClickHouse 的寬表構建,以最常見的單事實表多維表方式舉例。各位讀者朋友,如果你覺得還不錯,請點贊、評論加轉發吧。

更多精彩

加入社區

我們創建了 CloudCanal 微信交流群,在里面,您可以得到最新版本發布信息和資源鏈接,您能看到其他用戶一手評測、使用情況,您更能得到熱情的問題解答,當然您還可以給我們提需求和問題。掃描下方二維碼,添加我們小助手微信拉您進群,備注: 加 CloudCanal 群


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM