簡介: 利用實時數倉,企業能夠實現實時 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
離線數倉架構docker
進入 21 世紀,隨着計算技術的發展、以及總體算力的提高,決策的主體逐漸從人工控制轉變爲計算機算法,出現了實時推薦、實時監控分析等需求,對應的決策週期時間由天級逐步變爲秒級,在這些場景下,實時數倉應運而生。數據庫
當前的實時數倉主要有三種架構:Lambda架構、Kappa 架構以及實時 OLAP 變體架構:apache
實時數倉的 Lambda 架構json
實時數倉的 Kappa 架構
總結一下,對於實時數倉,Lambda 架構須要維護流批兩套引擎,開發成本相較其它二者更高。相比於 Kappa 架構,實時 OLAP 變體架構能夠執行更加靈活的計算,但須要依賴額外的實時 OLAP 算力資源。接下來咱們將介紹的 Flink + TiDB 實時數倉方案,就屬於實時 OLAP 變體架構。
關於實時數倉及這些架構更加詳細的對比說明,有興趣的讀者能夠參考 Flink 中文社區的這篇文章:基於 Flink 的典型 ETL 場景實現方案。
Flink 是一個低延遲、高吞吐、流批統一的大數據計算引擎,被廣泛用於高實時性場景下的實時計算,具備支持 exactly-once 等重要特性。
在集成了 TiFlash 以後,TiDB 已經成爲了真正的 HTAP(在線事務處理 OLTP + 在線分析處理 OLAP)數據庫。換句話說,在實時數倉架構中,TiDB 既能夠做爲數據源的業務數據庫,進行業務查詢的處理;又能夠做爲實時 OLAP 引擎,進行分析型場景的計算。
結合了 Flink 與 TiDB 二者的特性,Flink+ TiDB 的方案的優點也體現了出來:首先是速度有保障,二者均可以經過水平擴展節點來增長算力;其次,學習和配置成本相對較低,由於 TiDB 兼容 MySQL 5.7 協議,而最新版本的 Flink 也能夠徹底經過 Flink SQL 和強大的鏈接器(connector)來編寫提交任務,節省了用戶的學習成本。
對於 Flink + TiDB 實時數倉,下面是幾種經常使用的搭建原型,能夠用來知足不一樣的需求,也能夠在實際使用中自行擴展。
經過使用 Ververica 官方提供的 flink-connector-mysql-cdc,Flink 能夠既做爲採集層採集 MySQL 的 binlog 生成動態表,也做爲流計算層實現流式計算,如流式 Join、預聚合等。最後,Flink 經過 JDBC 鏈接器將計算完成的數據寫入 TiDB 中。
以 MySQL 做爲數據源的簡便架構
這個架構的優勢是很是簡潔方便,在 MySQL 和 TiDB 都準備好對應數據庫和表的狀況下,能夠經過只編寫 Flink SQL 來完成任務的註冊與提交。讀者能夠在本文末尾的【在docker-compose 中進行嘗試】一節中嘗試此架構。
若是數據已經從其它途徑存放到了Kafka 中,能夠方便地經過 Flink Kafka Connector 使 Flink 從 Kafka 中得到數據。
在這裏須要提一下的是,若是想要將 MySQL 或其它數據源的變動日誌存放在 Kafka 中後續供 Flink 處理,那麼推薦使用 Canal 或 Debezium 採集數據源變動日誌,由於 Flink 1.11 原生支持解析這兩種工具格式的 changelog,無需再額外實現解析器。
以 MySQL 做爲數據源,通過 Kafka 的架構示例
TiCDC 是一款經過拉取 TiKV 變動日誌實現的 TiDB 增量數據同步工具,能夠利用其將 TiDB 的變動數據輸出到消息隊列中,再由 Flink 提取。
以 TiDB 做爲數據源,經過 TiCDC 將 TiDB 的增量變化輸出到 Flink 中
在 4.0.7 版本,能夠經過 TiCDC Open Protocol來完成與 Flink 的對接。在以後的版本,TiCDC 將支持直接輸出爲 canal-json 形式,以供 Flink 使用。
上個部分介紹了一些基礎的架構,實踐中的探索每每更加複雜和有趣,這一部分將介紹一些具備表明性和啓發性的用戶案例。
小紅書是年輕人的生活方式平臺,用戶能夠經過短視頻、圖文等形式記錄生活點滴,分享生活方式,並基於興趣造成互動。截至到 2019 年 10 月,小紅書月活躍用戶數已通過億,並持續快速增加。
在小紅書的業務架構中,Flink 的數據來源和數據彙總處都是 TiDB,以達到相似於「物化視圖」的效果:
小紅書 Flink TiDB 集羣架構
整個過程造成了 TiDB 的閉環,將後續分析任務的 Join 工做轉移到了 Flink 上,並經過流式計算來緩解壓力。目前這套方案已經支持起了小紅書的內容審覈、筆記標籤推薦、增加審計等業務,經歷了大吞吐量的線上業務考驗且持續運行穩定。
貝殼金服持續多年深耕居住場景,積累了豐富的中國房產大數據。貝殼金服以金融科技爲驅動,利用 AI 算法高效應用多維海量數據以提高產品體驗,爲用戶提供豐富、定製化的金融服務。
在貝殼數據組的數據服務中,Flink 實時計算用於典型的維表 Join:
貝殼金服數據分析平臺架構
利用以上的結構,能夠將數據服務中的主表進行實時 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 層,直接服務業務上的統計、清單等需求,上層應用可直接使用構建好的數據,且得到了秒級的實時能力。
智慧芽數據分析平臺架構
用戶體驗:在使用了新架構後,入庫數據量、入庫規則和計算複雜度都大大降低,數據在 Flink Job 中已經按照業務需求處理完成並寫入 TiDB,再也不須要基於 Redshift 的 全量 ODS 層進行 T+1 ETL。基於 TiDB 構建的實時數倉,經過合理的數據分層,架構上得到了極大的精簡,開發維護也變得更加簡單;在數據查詢、更新、寫入性能上都得到大幅度提高;在知足不一樣的adhoc 分析需求時,再也不須要等待相似 Redshift 預編譯的過程;擴容方便簡單易於開發。
目前這套架構正在上線,在智慧芽內部用來進行用戶行爲分析和追蹤,並彙總出公司運營大盤、用戶行爲分析、租戶行爲分析等功能。
網易 2001 年正式成立在線遊戲事業部,通過近 20 年的發展,已躋身全球七大遊戲公司之一。在 App Annie 發佈的「2020 年度全球發行商 52 強」榜單中,網易位列第二。
網易互娛數據計費組平臺架構
在網易互娛計費組的應用架構中,一方面使用 Flink 完成業務數據源到 TiDB 的實時寫入;另外一方面,以 TiDB 做爲分析數據源,在後續的 Flink 集羣中進行實時流計算,生成分析報表。此外,網易互娛如今內部開發了 Flink 做業管理平臺,用於管理做業的整個生命週期。
知乎是中文互聯網綜合性內容平臺,以「讓每一個人高效得到可信賴的解答」爲品牌使命和北極星。截至 2019 年 1 月,知乎已擁有超過 2.2 億用戶,共產出 1.3 億個回答。
知乎做爲 PingCAP 的合做夥伴,同時也是 Flink 的深度用戶,在本身的實踐過程當中開發了一套 TiDB 與 Flink 交互工具並貢獻給了開源社區:pingcap-incubator/TiBigData,主要包括了以下功能:
爲了方便讀者更好的理解,咱們在 https://github.com/LittleFall/flink-tidb-rdw 中提供了一個基於 docker-compose 的 MySQL-Flink-TiDB 測試環境,供你們測試使用。
Flink TiDB 實時數倉 Slides 中提供了該場景下一個簡單的教程,包括概念解釋、代碼示例、簡單原理以及一些注意事項,其中示例包括:
在啓動 docker-compose 後,能夠經過 Flink SQL Client 來編寫並提交 Flink 任務,並經過 localhost:8081 來觀察任務執行狀況。
原文連接本文爲阿里雲原創內容,未經容許不得轉載。