當 TiDB 與 Flink 相結合:高效、易用的實時數倉

簡介: 利用實時數倉,企業能夠實現實時 OLAP 分析、實時數據看板、實時業務監控、實時數據接口服務等用途。但想到實時數倉,不少人的第一印象就是架構複雜,難以操做與維護。而得益於新版 Flink 對 SQL 的支持,以及 TiDB HTAP 的特性,咱們探索了一個高效、易用的 Flink+TiDB 實時數倉解決方案。html

做者:齊智@TiDBmysql

隨着互聯網飛速發展,企業業務種類會愈來愈多,業務數據量會愈來愈大,當發展到必定規模時,傳統的數據存儲結構逐漸沒法知足企業需求,實時數據倉庫就變成了一個必要的基礎服務。以維表 Join 爲例,數據在業務數據源中以範式表的形式存儲,在分析時須要作大量的 Join 操做,下降性能。若是在數據清洗導入過程當中就能流式的完成 Join,那麼分析時就無需再次 Join,從而提高查詢性能。git

利用實時數倉,企業能夠實現實時 OLAP 分析、實時數據看板、實時業務監控、實時數據接口服務等用途。但想到實時數倉,不少人的第一印象就是架構複雜,難以操做與維護。而得益於新版 Flink 對 SQL 的支持,以及 TiDB HTAP 的特性,咱們探索了一個高效、易用的 Flink+TiDB 實時數倉解決方案。github

本文將首先介紹實時數倉的概念,而後介紹 Flink+TiDB 實時數倉的架構與優點,接着給出一些已經在使用中的用戶場景,最後給出在 docker-compose 環境下的 Demo,用於讀者進行嘗試。算法

實時數倉的概念

數據倉庫的概念在 90 年代由 Bill Inmon 提出,是指一個面向主題的、集成的、相對穩定的、反映歷史變化的集合,用於支持管理決策。當時的數據倉庫經過消息隊列收集來自數據源的數據,經過天天或每週進行一次計算以供報表使用,也稱爲離線數倉。sql

1.jpg

離線數倉架構docker

進入 21 世紀,隨着計算技術的發展、以及總體算力的提高,決策的主體逐漸從人工控制轉變爲計算機算法,出現了實時推薦、實時監控分析等需求,對應的決策週期時間由天級逐步變爲秒級,在這些場景下,實時數倉應運而生。數據庫

當前的實時數倉主要有三種架構:Lambda架構、Kappa 架構以及實時 OLAP 變體架構:apache

  1. Lambda 架構是指在離線數倉的基礎上疊加了實時數倉部分,使用流式引擎處理實時性較高的數據,最後將離線和在線的結果統一供應用使用。

2.jpg

實時數倉的 Lambda 架構json

  1. Kappa 架構則移除了離線數倉部分,所有使用實時數據生產。這種架構統一了計算引擎,下降了開發成本。

3.jpg

實時數倉的 Kappa 架構

  1. 隨着實時 OLAP 技術的提高,一個新的實時架構被提出,暫時被稱爲「實時 OLAP 變體」。簡單來講,就是將一部分計算壓力從流式計算引擎轉嫁到實時 OLAP 分析引擎上,以此進行更加靈活的實時數倉計算。

4.jpg

總結一下,對於實時數倉,Lambda 架構須要維護流批兩套引擎,開發成本相較其它二者更高。相比於 Kappa 架構,實時 OLAP 變體架構能夠執行更加靈活的計算,但須要依賴額外的實時 OLAP 算力資源。接下來咱們將介紹的 Flink + TiDB 實時數倉方案,就屬於實時 OLAP 變體架構。

關於實時數倉及這些架構更加詳細的對比說明,有興趣的讀者能夠參考 Flink 中文社區的這篇文章:基於 Flink 的典型 ETL 場景實現方案。

Flink+ TiDB 實時數倉

Flink 是一個低延遲、高吞吐、流批統一的大數據計算引擎,被廣泛用於高實時性場景下的實時計算,具備支持 exactly-once 等重要特性。

在集成了 TiFlash 以後,TiDB 已經成爲了真正的 HTAP(在線事務處理 OLTP + 在線分析處理 OLAP)數據庫。換句話說,在實時數倉架構中,TiDB 既能夠做爲數據源的業務數據庫,進行業務查詢的處理;又能夠做爲實時 OLAP 引擎,進行分析型場景的計算。

結合了 Flink 與 TiDB 二者的特性,Flink+ TiDB 的方案的優點也體現了出來:首先是速度有保障,二者均可以經過水平擴展節點來增長算力;其次,學習和配置成本相對較低,由於 TiDB 兼容 MySQL 5.7 協議,而最新版本的 Flink 也能夠徹底經過 Flink SQL 和強大的鏈接器(connector)來編寫提交任務,節省了用戶的學習成本。

對於 Flink + TiDB 實時數倉,下面是幾種經常使用的搭建原型,能夠用來知足不一樣的需求,也能夠在實際使用中自行擴展。

以 MySQL 做爲數據源

經過使用 Ververica 官方提供的 flink-connector-mysql-cdc,Flink 能夠既做爲採集層採集 MySQL 的 binlog 生成動態表,也做爲流計算層實現流式計算,如流式 Join、預聚合等。最後,Flink 經過 JDBC 鏈接器將計算完成的數據寫入 TiDB 中。

5.jpg

以 MySQL 做爲數據源的簡便架構

這個架構的優勢是很是簡潔方便,在 MySQL 和 TiDB 都準備好對應數據庫和表的狀況下,能夠經過只編寫 Flink SQL 來完成任務的註冊與提交。讀者能夠在本文末尾的【在docker-compose 中進行嘗試】一節中嘗試此架構。

以 Kafka 對接 Flink

若是數據已經從其它途徑存放到了Kafka 中,能夠方便地經過 Flink Kafka Connector 使 Flink 從 Kafka 中得到數據。

在這裏須要提一下的是,若是想要將 MySQL 或其它數據源的變動日誌存放在 Kafka 中後續供 Flink 處理,那麼推薦使用 Canal 或 Debezium 採集數據源變動日誌,由於 Flink 1.11 原生支持解析這兩種工具格式的 changelog,無需再額外實現解析器。

6.jpg

以 MySQL 做爲數據源,通過 Kafka 的架構示例

以 TiDB 做爲數據源

TiCDC 是一款經過拉取 TiKV 變動日誌實現的 TiDB 增量數據同步工具,能夠利用其將 TiDB 的變動數據輸出到消息隊列中,再由 Flink 提取。

7.jpg

以 TiDB 做爲數據源,經過 TiCDC 將 TiDB 的增量變化輸出到 Flink 中

在 4.0.7 版本,能夠經過 TiCDC Open Protocol來完成與 Flink 的對接。在以後的版本,TiCDC 將支持直接輸出爲 canal-json 形式,以供 Flink 使用。

案例與實踐

上個部分介紹了一些基礎的架構,實踐中的探索每每更加複雜和有趣,這一部分將介紹一些具備表明性和啓發性的用戶案例。

小紅書

小紅書是年輕人的生活方式平臺,用戶能夠經過短視頻、圖文等形式記錄生活點滴,分享生活方式,並基於興趣造成互動。截至到 2019 年 10 月,小紅書月活躍用戶數已通過億,並持續快速增加。

在小紅書的業務架構中,Flink 的數據來源和數據彙總處都是 TiDB,以達到相似於「物化視圖」的效果:

  1. 左上角的線上業務表執行正常的 OLTP 任務。
  2. 下方的 TiCDC 集羣抽取 TiDB 的實時變動數據,以 changelog 形式傳遞到 Kafka 中。
  3. Flink 讀取 Kafka 中的 changelog,進行計算,如拼好寬表或聚合表。
  4. Flink 將結果寫回到 TiDB 的寬表中,用於後續分析使用。

8.jpg

小紅書 Flink TiDB 集羣架構

整個過程造成了 TiDB 的閉環,將後續分析任務的 Join 工做轉移到了 Flink 上,並經過流式計算來緩解壓力。目前這套方案已經支持起了小紅書的內容審覈、筆記標籤推薦、增加審計等業務,經歷了大吞吐量的線上業務考驗且持續運行穩定。

貝殼金服

貝殼金服持續多年深耕居住場景,積累了豐富的中國房產大數據。貝殼金服以金融科技爲驅動,利用 AI 算法高效應用多維海量數據以提高產品體驗,爲用戶提供豐富、定製化的金融服務。

在貝殼數據組的數據服務中,Flink 實時計算用於典型的維表 Join:

  1. 首先,使用 Syncer (MySQL 到 TiDB 的一個輕量級同步工具)採集業務數據源上的維表數據同步到 TiDB 中。
  2. 而後,業務數據源上的流表數據則經過 Canal 採集 binlog 存入 kafka 消息隊列中。
  3. Flink 讀取 Kafka 中流表的變動日誌,嘗試進行流式 Join,每當須要維表中的數據時,就去 TiDB 中查找。
  4. 最後,Flink 將拼合而成的寬表寫入到 TiDB 中,用於數據分析服務。

9.jpg

貝殼金服數據分析平臺架構

利用以上的結構,能夠將數據服務中的主表進行實時 Join 落地,而後服務方只須要查詢單表。這套系統在貝殼金服已經深刻各個核心業務系統,跨系統的數據獲取統一走數據組的數據服務,省去了業務系統開發 API 和內存聚合數據代碼的開發工做。

智慧芽

PatSnap(智慧芽)是一款全球專利檢索數據庫,整合了 1790 年至今的全球 116 個國家地區 1.3 億專利數據和 1.7 億化學結構數據。可檢索、瀏覽、翻譯專利,生成 Insights 專利分析報告,用於專利價值分析、引用分析、法律搜索,查看 3D 專利地圖。

智慧芽使用 Flink + TiDB 替換了原有的 Segment + Redshift 架構。

原有的 Segment + Redshift 架構,僅構建出了 ODS 層,數據寫入的規則和 schema 不受控制。且須要針對 ODS 編寫複雜的 ETL 來按照業務需求進行各種指標的計算來完成上層需求。Redshift 中落庫數據量大,計算慢(T+1 時效),並影響對外服務性能。

替換爲基於 Kinesis +Flink + TiDB 構建的實時數倉架構後,再也不須要構建 ODS 層。Flink 做爲前置計算單元,直接從業務出發構建出 Flink Job ETL,徹底控制了落庫規則並自定義 schema;即僅把業務關注的指標進行清洗並寫入 TiDB 來進行後續的分析查詢,寫入數據量大大減小。按用戶/租戶、地區、業務動做等關注的指標,結合分鐘、小時、天等不一樣粒度的時間窗口等,在 TiDB 上構建出 DWD/DWS/ADS 層,直接服務業務上的統計、清單等需求,上層應用可直接使用構建好的數據,且得到了秒級的實時能力。

10.jpg

智慧芽數據分析平臺架構

用戶體驗:在使用了新架構後,入庫數據量、入庫規則和計算複雜度都大大降低,數據在 Flink Job 中已經按照業務需求處理完成並寫入 TiDB,再也不須要基於 Redshift 的 全量 ODS 層進行 T+1 ETL。基於 TiDB 構建的實時數倉,經過合理的數據分層,架構上得到了極大的精簡,開發維護也變得更加簡單;在數據查詢、更新、寫入性能上都得到大幅度提高;在知足不一樣的adhoc 分析需求時,再也不須要等待相似 Redshift 預編譯的過程;擴容方便簡單易於開發。

目前這套架構正在上線,在智慧芽內部用來進行用戶行爲分析和追蹤,並彙總出公司運營大盤、用戶行爲分析、租戶行爲分析等功能。

網易互娛

網易 2001 年正式成立在線遊戲事業部,通過近 20 年的發展,已躋身全球七大遊戲公司之一。在 App Annie 發佈的「2020 年度全球發行商 52 強」榜單中,網易位列第二。

11.jpg

網易互娛數據計費組平臺架構

在網易互娛計費組的應用架構中,一方面使用 Flink 完成業務數據源到 TiDB 的實時寫入;另外一方面,以 TiDB 做爲分析數據源,在後續的 Flink 集羣中進行實時流計算,生成分析報表。此外,網易互娛如今內部開發了 Flink 做業管理平臺,用於管理做業的整個生命週期。

知乎

知乎是中文互聯網綜合性內容平臺,以「讓每一個人高效得到可信賴的解答」爲品牌使命和北極星。截至 2019 年 1 月,知乎已擁有超過 2.2 億用戶,共產出 1.3 億個回答。

知乎做爲 PingCAP 的合做夥伴,同時也是 Flink 的深度用戶,在本身的實踐過程當中開發了一套 TiDB 與 Flink 交互工具並貢獻給了開源社區:pingcap-incubator/TiBigData,主要包括了以下功能:

  1. TiDB 做爲 Flink Source Connector,用於批式同步數據。
  2. TiDB 做爲 Flink Sink Connector,基於 JDBC 實現。
  3. Flink TiDB Catalog,能夠在 Flink SQL 中直接使用 TiDB 的表,無需再次建立。

在 docker-compose 中進行嘗試

爲了方便讀者更好的理解,咱們在 https://github.com/LittleFall/flink-tidb-rdw 中提供了一個基於 docker-compose 的 MySQL-Flink-TiDB 測試環境,供你們測試使用。

Flink TiDB 實時數倉 Slides 中提供了該場景下一個簡單的教程,包括概念解釋、代碼示例、簡單原理以及一些注意事項,其中示例包括:

  1. Flink SQL 簡單嘗試
  2. 利用 Flink 進行從 MySQL 到 TiDB 的數據導入
  3. 雙流 Join
  4. 維表 Join

在啓動 docker-compose 後,能夠經過 Flink SQL Client 來編寫並提交 Flink 任務,並經過 localhost:8081 來觀察任務執行狀況。

原文連接本文爲阿里雲原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索