当 TiDB 与 Flink 相结合:高效、易用的实时数仓
作者:齊智@TiDB
隨著互聯(lián)網(wǎng)飛速發(fā)展,企業(yè)業(yè)務(wù)種類會越來越多,業(yè)務(wù)數(shù)據(jù)量會越來越大,當(dāng)發(fā)展到一定規(guī)模時,傳統(tǒng)的數(shù)據(jù)存儲結(jié)構(gòu)逐漸無法滿足企業(yè)需求,實時數(shù)據(jù)倉庫就變成了一個必要的基礎(chǔ)服務(wù)。以維表 Join 為例,數(shù)據(jù)在業(yè)務(wù)數(shù)據(jù)源中以范式表的形式存儲,在分析時需要做大量的 Join 操作,降低性能。如果在數(shù)據(jù)清洗導(dǎo)入過程中就能流式的完成 Join,那么分析時就無需再次 Join,從而提升查詢性能。
利用實時數(shù)倉,企業(yè)可以實現(xiàn)實時 OLAP 分析、實時數(shù)據(jù)看板、實時業(yè)務(wù)監(jiān)控、實時數(shù)據(jù)接口服務(wù)等用途。但想到實時數(shù)倉,很多人的第一印象就是架構(gòu)復(fù)雜,難以操作與維護。而得益于新版 Flink 對 SQL 的支持,以及 TiDB HTAP 的特性,我們探索了一個高效、易用的 Flink+TiDB 實時數(shù)倉解決方案。
本文將首先介紹實時數(shù)倉的概念,然后介紹 Flink+TiDB 實時數(shù)倉的架構(gòu)與優(yōu)勢,接著給出一些已經(jīng)在使用中的用戶場景,最后給出在 docker-compose 環(huán)境下的 Demo,用于讀者進行嘗試。
實時數(shù)倉的概念
數(shù)據(jù)倉庫的概念在 90 年代由 Bill Inmon 提出,是指一個面向主題的、集成的、相對穩(wěn)定的、反映歷史變化的集合,用于支持管理決策。當(dāng)時的數(shù)據(jù)倉庫通過消息隊列收集來自數(shù)據(jù)源的數(shù)據(jù),通過每天或每周進行一次計算以供報表使用,也稱為離線數(shù)倉。
離線數(shù)倉架構(gòu)
進入 21 世紀(jì),隨著計算技術(shù)的發(fā)展、以及整體算力的提升,決策的主體逐漸從人工控制轉(zhuǎn)變?yōu)橛嬎銠C算法,出現(xiàn)了實時推薦、實時監(jiān)控分析等需求,對應(yīng)的決策周期時間由天級逐步變?yōu)槊爰?#xff0c;在這些場景下,實時數(shù)倉應(yīng)運而生。
當(dāng)前的實時數(shù)倉主要有三種架構(gòu):Lambda架構(gòu)、Kappa 架構(gòu)以及實時 OLAP 變體架構(gòu):
實時數(shù)倉的 Lambda 架構(gòu)
實時數(shù)倉的 Kappa 架構(gòu)
總結(jié)一下,對于實時數(shù)倉,Lambda 架構(gòu)需要維護流批兩套引擎,開發(fā)成本相較其它兩者更高。相比于 Kappa 架構(gòu),實時 OLAP 變體架構(gòu)可以執(zhí)行更加靈活的計算,但需要依賴額外的實時 OLAP 算力資源。接下來我們將介紹的 Flink + TiDB 實時數(shù)倉方案,就屬于實時 OLAP 變體架構(gòu)。
關(guān)于實時數(shù)倉及這些架構(gòu)更加詳細的對比說明,有興趣的讀者可以參考 Flink 中文社區(qū)的這篇文章:基于 Flink 的典型 ETL 場景實現(xiàn)方案。
Flink+ TiDB 實時數(shù)倉
Flink 是一個低延遲、高吞吐、流批統(tǒng)一的大數(shù)據(jù)計算引擎,被普遍用于高實時性場景下的實時計算,具有支持 exactly-once 等重要特性。
在集成了 TiFlash 之后,TiDB 已經(jīng)成為了真正的 HTAP(在線事務(wù)處理 OLTP + 在線分析處理 OLAP)數(shù)據(jù)庫。換句話說,在實時數(shù)倉架構(gòu)中,TiDB 既可以作為數(shù)據(jù)源的業(yè)務(wù)數(shù)據(jù)庫,進行業(yè)務(wù)查詢的處理;又可以作為實時 OLAP 引擎,進行分析型場景的計算。
結(jié)合了 Flink 與 TiDB 兩者的特性,Flink+ TiDB 的方案的優(yōu)勢也體現(xiàn)了出來:首先是速度有保障,兩者都可以通過水平擴展節(jié)點來增加算力;其次,學(xué)習(xí)和配置成本相對較低,因為 TiDB 兼容 MySQL 5.7 協(xié)議,而最新版本的 Flink 也可以完全通過 Flink SQL 和強大的連接器(connector)來編寫提交任務(wù),節(jié)省了用戶的學(xué)習(xí)成本。
對于 Flink + TiDB 實時數(shù)倉,下面是幾種常用的搭建原型,可以用來滿足不同的需求,也可以在實際使用中自行擴展。
以 MySQL 作為數(shù)據(jù)源
通過使用 Ververica 官方提供的 flink-connector-mysql-cdc,Flink 可以既作為采集層采集 MySQL 的 binlog 生成動態(tài)表,也作為流計算層實現(xiàn)流式計算,如流式 Join、預(yù)聚合等。最后,Flink 通過 JDBC 連接器將計算完成的數(shù)據(jù)寫入 TiDB 中。
以 MySQL 作為數(shù)據(jù)源的簡便架構(gòu)
這個架構(gòu)的優(yōu)點是非常簡潔方便,在 MySQL 和 TiDB 都準(zhǔn)備好對應(yīng)數(shù)據(jù)庫和表的情況下,可以通過只編寫 Flink SQL 來完成任務(wù)的注冊與提交。讀者可以在本文末尾的【在docker-compose 中進行嘗試】一節(jié)中嘗試此架構(gòu)。
以 Kafka 對接 Flink
如果數(shù)據(jù)已經(jīng)從其它途徑存放到了Kafka 中,可以方便地通過 Flink Kafka Connector 使 Flink 從 Kafka 中獲得數(shù)據(jù)。
在這里需要提一下的是,如果想要將 MySQL 或其它數(shù)據(jù)源的變更日志存放在 Kafka 中后續(xù)供 Flink 處理,那么推薦使用 Canal 或 Debezium 采集數(shù)據(jù)源變更日志,因為 Flink 1.11 原生支持解析這兩種工具格式的 changelog,無需再額外實現(xiàn)解析器。
以 MySQL 作為數(shù)據(jù)源,經(jīng)過 Kafka 的架構(gòu)示例
以 TiDB 作為數(shù)據(jù)源
TiCDC 是一款通過拉取 TiKV 變更日志實現(xiàn)的 TiDB 增量數(shù)據(jù)同步工具,可以利用其將 TiDB 的變更數(shù)據(jù)輸出到消息隊列中,再由 Flink 提取。
以 TiDB 作為數(shù)據(jù)源,通過 TiCDC 將 TiDB 的增量變化輸出到 Flink 中
在 4.0.7 版本,可以通過 TiCDC Open Protocol來完成與 Flink 的對接。在之后的版本,TiCDC 將支持直接輸出為 canal-json 形式,以供 Flink 使用。
案例與實踐
上個部分介紹了一些基礎(chǔ)的架構(gòu),實踐中的探索往往更加復(fù)雜和有趣,這一部分將介紹一些具有代表性和啟發(fā)性的用戶案例。
小紅書
小紅書是年輕人的生活方式平臺,用戶可以通過短視頻、圖文等形式記錄生活點滴,分享生活方式,并基于興趣形成互動。截至到 2019 年 10 月,小紅書月活躍用戶數(shù)已經(jīng)過億,并持續(xù)快速增長。
在小紅書的業(yè)務(wù)架構(gòu)中,Flink 的數(shù)據(jù)來源和數(shù)據(jù)匯總處都是 TiDB,以達到類似于“物化視圖”的效果:
小紅書 Flink TiDB 集群架構(gòu)
整個過程形成了 TiDB 的閉環(huán),將后續(xù)分析任務(wù)的 Join 工作轉(zhuǎn)移到了 Flink 上,并通過流式計算來緩解壓力。目前這套方案已經(jīng)支持起了小紅書的內(nèi)容審核、筆記標(biāo)簽推薦、增長審計等業(yè)務(wù),經(jīng)歷了大吞吐量的線上業(yè)務(wù)考驗且持續(xù)運行穩(wěn)定。
貝殼金服
貝殼金服持續(xù)多年深耕居住場景,積累了豐富的中國房產(chǎn)大數(shù)據(jù)。貝殼金服以金融科技為驅(qū)動,利用 AI 算法高效應(yīng)用多維海量數(shù)據(jù)以提升產(chǎn)品體驗,為用戶提供豐富、定制化的金融服務(wù)。
在貝殼數(shù)據(jù)組的數(shù)據(jù)服務(wù)中,Flink 實時計算用于典型的維表 Join:
貝殼金服數(shù)據(jù)分析平臺架構(gòu)
利用以上的結(jié)構(gòu),可以將數(shù)據(jù)服務(wù)中的主表進行實時 Join 落地,然后服務(wù)方只需要查詢單表。這套系統(tǒng)在貝殼金服已經(jīng)深入各個核心業(yè)務(wù)系統(tǒng),跨系統(tǒng)的數(shù)據(jù)獲取統(tǒng)一走數(shù)據(jù)組的數(shù)據(jù)服務(wù),省去了業(yè)務(wù)系統(tǒng)開發(fā) API 和內(nèi)存聚合數(shù)據(jù)代碼的開發(fā)工作。
智慧芽
PatSnap(智慧芽)是一款全球?qū)@麢z索數(shù)據(jù)庫,整合了 1790 年至今的全球 116 個國家地區(qū) 1.3 億專利數(shù)據(jù)和 1.7 億化學(xué)結(jié)構(gòu)數(shù)據(jù)。可檢索、瀏覽、翻譯專利,生成 Insights 專利分析報告,用于專利價值分析、引用分析、法律搜索,查看 3D 專利地圖。
智慧芽使用 Flink + TiDB 替換了原有的 Segment + Redshift 架構(gòu)。
原有的 Segment + Redshift 架構(gòu),僅構(gòu)建出了 ODS 層,數(shù)據(jù)寫入的規(guī)則和 schema 不受控制。且需要針對 ODS 編寫復(fù)雜的 ETL 來按照業(yè)務(wù)需求進行各類指標(biāo)的計算來完成上層需求。Redshift 中落庫數(shù)據(jù)量大,計算慢(T+1 時效),并影響對外服務(wù)性能。
替換為基于 Kinesis +Flink + TiDB 構(gòu)建的實時數(shù)倉架構(gòu)后,不再需要構(gòu)建 ODS 層。Flink 作為前置計算單元,直接從業(yè)務(wù)出發(fā)構(gòu)建出 Flink Job ETL,完全控制了落庫規(guī)則并自定義 schema;即僅把業(yè)務(wù)關(guān)注的指標(biāo)進行清洗并寫入 TiDB 來進行后續(xù)的分析查詢,寫入數(shù)據(jù)量大大減少。按用戶/租戶、地區(qū)、業(yè)務(wù)動作等關(guān)注的指標(biāo),結(jié)合分鐘、小時、天等不同粒度的時間窗口等,在 TiDB 上構(gòu)建出 DWD/DWS/ADS 層,直接服務(wù)業(yè)務(wù)上的統(tǒng)計、清單等需求,上層應(yīng)用可直接使用構(gòu)建好的數(shù)據(jù),且獲得了秒級的實時能力。
智慧芽數(shù)據(jù)分析平臺架構(gòu)
用戶體驗:在使用了新架構(gòu)后,入庫數(shù)據(jù)量、入庫規(guī)則和計算復(fù)雜度都大大下降,數(shù)據(jù)在 Flink Job 中已經(jīng)按照業(yè)務(wù)需求處理完成并寫入 TiDB,不再需要基于 Redshift 的 全量 ODS 層進行 T+1 ETL。基于 TiDB 構(gòu)建的實時數(shù)倉,通過合理的數(shù)據(jù)分層,架構(gòu)上獲得了極大的精簡,開發(fā)維護也變得更加簡單;在數(shù)據(jù)查詢、更新、寫入性能上都獲得大幅度提升;在滿足不同的adhoc 分析需求時,不再需要等待類似 Redshift 預(yù)編譯的過程;擴容方便簡單易于開發(fā)。
目前這套架構(gòu)正在上線,在智慧芽內(nèi)部用來進行用戶行為分析和追蹤,并匯總出公司運營大盤、用戶行為分析、租戶行為分析等功能。
網(wǎng)易互娛
網(wǎng)易 2001 年正式成立在線游戲事業(yè)部,經(jīng)過近 20 年的發(fā)展,已躋身全球七大游戲公司之一。在 App Annie 發(fā)布的“2020 年度全球發(fā)行商 52 強”榜單中,網(wǎng)易位列第二。
網(wǎng)易互娛數(shù)據(jù)計費組平臺架構(gòu)
在網(wǎng)易互娛計費組的應(yīng)用架構(gòu)中,一方面使用 Flink 完成業(yè)務(wù)數(shù)據(jù)源到 TiDB 的實時寫入;另一方面,以 TiDB 作為分析數(shù)據(jù)源,在后續(xù)的 Flink 集群中進行實時流計算,生成分析報表。此外,網(wǎng)易互娛現(xiàn)在內(nèi)部開發(fā)了 Flink 作業(yè)管理平臺,用于管理作業(yè)的整個生命周期。
知乎
知乎是中文互聯(lián)網(wǎng)綜合性內(nèi)容平臺,以“讓每個人高效獲得可信賴的解答”為品牌使命和北極星。截至 2019 年 1 月,知乎已擁有超過 2.2 億用戶,共產(chǎn)出 1.3 億個回答。
知乎作為 PingCAP 的合作伙伴,同時也是 Flink 的深度用戶,在自己的實踐過程中開發(fā)了一套 TiDB 與 Flink 交互工具并貢獻給了開源社區(qū):pingcap-incubator/TiBigData,主要包括了如下功能:
在 docker-compose 中進行嘗試
為了方便讀者更好的理解,我們在 https://github.com/LittleFall/flink-tidb-rdw 中提供了一個基于 docker-compose 的 MySQL-Flink-TiDB 測試環(huán)境,供大家測試使用。
Flink TiDB 實時數(shù)倉 Slides 中提供了該場景下一個簡單的教程,包括概念解釋、代碼示例、簡單原理以及一些注意事項,其中示例包括:
在啟動 docker-compose 后,可以通過 Flink SQL Client 來編寫并提交 Flink 任務(wù),并通過 localhost:8081 來觀察任務(wù)執(zhí)行情況。
如果大家對 Flink+TiDB 實時數(shù)倉方案有興趣、疑惑,或者在探索實踐過程中積累了想要分享的經(jīng)驗,歡迎到 TiDB 社區(qū)(如 AskTUG)、Flink 社區(qū)(如 Flink 中文郵件)或通過我的郵件(qizhi@pingcap.com)進行探討。
參考閱讀
Flink 中文社區(qū)關(guān)于實時數(shù)倉概念及流上 Join 的討論:
基于 Flink 的典型 ETL 場景實現(xiàn)方案
[小紅書使用 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 架構(gòu)以及在數(shù)據(jù)平臺上的應(yīng)用](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 上線!我們總結(jié)了 13 條生產(chǎn)實踐經(jīng)驗](https://zhuanlan.zhihu.com/p/243187428
)
更多 Flink 技術(shù)交流可加入 Apache Flink 社區(qū)釘釘交流群:
原文鏈接:https://developer.aliyun.com/article/776726?
版權(quán)聲明:本文內(nèi)容由阿里云實名注冊用戶自發(fā)貢獻,版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進行舉報,一經(jīng)查實,本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的当 TiDB 与 Flink 相结合:高效、易用的实时数仓的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里打造全球首个纯机器人送货高校,22个
- 下一篇: 网易云音乐基于 Flink + Kafk