天天看點

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

作者:齊智@TiDB

随着網際網路飛速發展,企業業務種類會越來越多,業務資料量會越來越大,當發展到一定規模時,傳統的資料存儲結構逐漸無法滿足企業需求,實時資料倉庫就變成了一個必要的基礎服務。以維表 Join 為例,資料在業務資料源中以範式表的形式存儲,在分析時需要做大量的 Join 操作,降低性能。如果在資料清洗導入過程中就能流式的完成 Join,那麼分析時就無需再次 Join,進而提升查詢性能。

利用實時數倉,企業可以實作實時 OLAP 分析、實時資料看闆、實時業務監控、實時資料接口服務等用途。但想到實時數倉,很多人的第一印象就是架構複雜,難以操作與維護。而得益于新版 Flink 對 SQL 的支援,以及 TiDB HTAP 的特性,我們探索了一個高效、易用的 Flink+TiDB 實時數倉解決方案。

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

實時數倉的概念

資料倉庫的概念在 90 年代由 Bill Inmon 提出,是指一個面向主題的、內建的、相對穩定的、反映曆史變化的集合,用于支援管理決策。當時的資料倉庫通過消息隊列收集來自資料源的資料,通過每天或每周進行一次計算以供報表使用,也稱為離線數倉。

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

離線數倉架構

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

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

  1. Lambda 架構是指在離線數倉的基礎上疊加了實時數倉部分,使用流式引擎處理實時性較高的資料,最後将離線和線上的結果統一供應用使用。
當 TiDB 與 Flink 相結合:高效、易用的實時數倉

實時數倉的 Lambda 架構

  1. Kappa 架構則移除了離線數倉部分,全部使用實時資料生産。這種架構統一了計算引擎,降低了開發成本。
當 TiDB 與 Flink 相結合:高效、易用的實時數倉

實時數倉的 Kappa 架構

  1. 随着實時 OLAP 技術的提升,一個新的實時架構被提出,暫時被稱為“實時 OLAP 變體”。簡單來說,就是将一部分計算壓力從流式計算引擎轉嫁到實時 OLAP 分析引擎上,以此進行更加靈活的實時數倉計算。
當 TiDB 與 Flink 相結合:高效、易用的實時數倉

總結一下,對于實時數倉,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 中。

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

以 MySQL 作為資料源的簡便架構

這個架構的優點是非常簡潔友善,在 MySQL 和 TiDB 都準備好對應資料庫和表的情況下,可以通過隻編寫 Flink SQL 來完成任務的注冊與送出。讀者可以在本文末尾的【在docker-compose 中進行嘗試】一節中嘗試此架構。

以 Kafka 對接 Flink

如果資料已經從其它途徑存放到了Kafka 中,可以友善地通過

Flink Kafka Connector

使 Flink 從 Kafka 中獲得資料。

在這裡需要提一下的是,如果想要将 MySQL 或其它資料源的變更日志存放在 Kafka 中後續供 Flink 處理,那麼推薦使用 Canal 或 Debezium 采集資料源變更日志,因為 Flink 1.11 原生支援解析這兩種工具格式的 changelog,無需再額外實作解析器。

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

以 MySQL 作為資料源,經過 Kafka 的架構示例

以 TiDB 作為資料源

TiCDC

是一款通過拉取 TiKV 變更日志實作的 TiDB 增量資料同步工具,可以利用其将 TiDB 的變更資料輸出到消息隊列中,再由 Flink 提取。

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

以 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 的寬表中,用于後續分析使用。
當 TiDB 與 Flink 相結合:高效、易用的實時數倉

小紅書 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 中,用于資料分析服務。
當 TiDB 與 Flink 相結合:高效、易用的實時數倉

貝殼金服資料分析平台架構

利用以上的結構,可以将資料服務中的主表進行實時 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 層,直接服務業務上的統計、清單等需求,上層應用可直接使用建構好的資料,且獲得了秒級的實時能力。

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

智慧芽資料分析平台架構

使用者體驗:在使用了新架構後,入庫資料量、入庫規則和計算複雜度都大大下降,資料在 Flink Job 中已經按照業務需求處理完成并寫入 TiDB,不再需要基于 Redshift 的 全量 ODS 層進行 T+1 ETL。基于 TiDB 建構的實時數倉,通過合理的資料分層,架構上獲得了極大的精簡,開發維護也變得更加簡單;在資料查詢、更新、寫入性能上都獲得大幅度提升;在滿足不同的adhoc 分析需求時,不再需要等待類似 Redshift 預編譯的過程;擴容友善簡單易于開發。

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

網易互娛

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

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

網易互娛資料計費組平台架構

在網易互娛計費組的應用架構中,一方面使用 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 來觀察任務執行情況。

如果大家對 Flink+TiDB 實時數倉方案有興趣、疑惑,或者在探索實踐過程中積累了想要分享的經驗,歡迎到 TiDB 社群(如

AskTUG

)、Flink 社群(如

Flink 中文郵件

)或通過我的郵件([email protected])進行探讨。

參考閱讀

Flink 中文社群關于實時數倉概念及流上 Join 的讨論:

基于 Flink 的典型 ETL 場景實作方案

[小紅書使用 TiDB 的實踐分享](How We Use a Scale-Out HTAP Database for Real-TimeAnalytics and Complex Queries

https://en.pingcap.com/case-studies/how-we-use-a-scale-out-htap-database-for-real-time-analytics-and-complex-queries)

[TiDB的 HTAP 架構以及在資料平台上的應用](How We Build an HTAP Database That Simplifies Your DataPlatform

https://dzone.com/articles/how-we-build-an-htap-database-that-simplifies-your)

[TiDB 原理論文](TiDB:A Raft-based HTAP Database

http://www.vldb.org/pvldb/vol13/p3072-huang.pdf

)

[FlinkSQL CDC 上線!我們總結了 13 條生産實踐經驗](

https://zhuanlan.zhihu.com/p/243187428

更多 Flink 技術交流可加入 Apache Flink 社群釘釘交流群:

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