天天看點

應用實踐 | 物易雲通基于 Apache Doris 的實時資料倉庫建設業務背景數倉架構演進新架構的優勢系統重點功能新架構的收益問題與經驗寫在最後

導讀: 物易雲通目前已成為國内産融供應鍊營運服務平台的領軍企業之一,平台年交易額超過 200 億元 , 随着公司業務的快速發展,對資料計算分析的時效要求也越來越高。經資料團隊的調研對比,于 2021 年引入了 Apache Doris 作為實時資料倉庫。實戰過程中獲得一些經驗,在此分享給大家。

作者|物易雲通 / 司機寶大資料負責人 吳凡

業務背景

武漢物易雲通網絡科技有限公司成立于 2015 年 6 月,總部位于湖北省武漢市東湖高新區。作為國内産業網際網路的探索先行者,公司緻力于将産業網際網路思維與新一代資訊技術深化應用于煤炭、建築、再生資源三大業務領域,以标準化、場景化、數字化的供應鍊綜合服務解決能力,開創網際網路化的 “供應鍊技術 + 物流服務 + 金融場景” 的産融協同新生态。目前公司已成為國内産融供應鍊營運服務平台的領軍企業之一,平台年交易額超過 200 億元。公司入選 2020 年中國網際網路企業綜合實力 100 強,2021 年武漢市軟體收入第一名。

随着公司業務的快速發展,對資料計算分析的時效要求也越來越高。之前的産品已經無法應對龐大的資料量,為解決這一問題,資料團隊通過調研對比,在 2021 年引入了 Apache Doris 作為實時資料倉庫。基于 Apache Doris 建設實時數倉的過程中,沉澱了許多經驗,借此機會分享給大家。

數倉架構演進

公司創業之初,是使用 MySQL 作為 BI 倉庫,每天增量卸數後導入,通過定時排程存儲過程進行計算。該方案能快速滿足公司的跨庫資料關聯計算的需求,但是随着業務發展,資料和任務不斷增多,MySQL 已難以支援,另外該方案局限性比較大,如果業務表存在實體删除或者沒有資料更新時間的情況下,則會導緻資料不準。

為了解決上述問題,我們搭建了一套 CDH 作為資料倉庫。通過 Canal 訂閱 MySQL 的 Binlog 到 Kafka,進行編寫消費程式,将資料寫入 Hbase,然後增量合并到 Hive 中,通過 Oozie 排程計算腳本。

然而離線 T+1 的資料隻能滿足一部分的業務需求,是以我們需要一套能快速查詢實時資料的資料倉庫,同時可以支援離線需求和實時需求,經過許多産品的調研對比,證明 Apache Doris 可以很好地實作我們的業務需求。

應用實踐 | 物易雲通基于 Apache Doris 的實時資料倉庫建設業務背景數倉架構演進新架構的優勢系統重點功能新架構的收益問題與經驗寫在最後

image.png

Doris 數倉架構通過 Flink CDC 實時接入生産庫資料到 Doris,支援實時 OLAP,然後通過海豚排程器定時執行 SQL 腳本,替代 Hive 的離線資料計算任務。

新架構的優勢

1、資料處理架構簡單 新的架構裡我們使用了 Flink CDC 來做資料同步(Flink CDC 内置了一套 Debezium 和 Kafka 元件,但這個細節對使用者屏蔽),它不但可以讀取增量,還能讀取全量資料,然後将資料通過 Stream load 的方式寫入 Doris。

2、一份資料,實時全量 由于 Hive 查詢很慢,是以之前是把 Hive 的資料通過 Sqoop 推送到 MySQL 進行查詢,即有多份資料存儲在不同的 MySQL 上,維護和存儲成本都很高,并且 Hive 裡隻有 T-1 的資料,需要每天寫腳本合并。Doris 支援 MySQL 協定,可直接查詢,同時 Doris 支援主鍵資料去重及更新,有實時的全量資料,解決了實時報表和線上 OLAP 的需求。

3、架構簡單,易于部署維護 相對于 Hadoop 那一套各種元件來說,Doris 部署維護非常簡單。

4、一鍵全庫接入,結構實時同步 通過自研的資料易平台,實作了 MySQL 一鍵全庫接入 Doris,即通過頁面選擇後,一鍵生成 Flink CDC 任務在 Yarn 上持續運作。而且通過解析 Binlog 裡面的 DDL 語句,将其轉化為 Doris 文法,利用 Doris 的 Online Schema Change 特性,實時同步生産資料庫的表結構變更,保障了表結構一緻,新增字段資料一緻。

5、秒級查詢 Doris 查詢是秒級,Hive 是分鐘級,跑批的效率提升了 20-30 倍。而之前用的是 Impala 加速 Hive 的查詢,每個表在使用前都要 Refresh 一次,非常麻煩,并且 Count Distinct Impala 近似計算不準确。

系統重點功能

資料接入

第一步:選擇需要接入的 MySQL 庫類型,預設是 A,即最常見的全局庫名唯一。

應用實踐 | 物易雲通基于 Apache Doris 的實時資料倉庫建設業務背景數倉架構演進新架構的優勢系統重點功能新架構的收益問題與經驗寫在最後

image.png

另外還存在幾種其他的情況:

B、全局有多個名稱相同、結構不一緻的資料庫。比如:部分大表做了資料切割歸檔到另一台機器上了。

C、全局有多個名稱相同、結構一緻的資料庫,即分庫。我們需要将資料合并到一個 Doris 庫表中,友善資料分析。

D、全局有多個名稱不同、結構一緻的庫。比如:DB 租戶 A 的庫, DB 租戶 B 的庫,我們也是要把資料合并分析。

第二步,選擇 MySQL 庫執行個體,進行送出(如果不想接入全庫,可以勾選部分表)。對應的目标資料庫是 Doris 裡面的 ODS 貼源層,和生産資料保持一緻,一個庫一個任務,可以視情況調整記憶體等參數。

應用實踐 | 物易雲通基于 Apache Doris 的實時資料倉庫建設業務背景數倉架構演進新架構的優勢系統重點功能新架構的收益問題與經驗寫在最後

image.png

注意: 通過清單可以進行任務管理,恢複任務是運用了 Flink CDC 的 Checkpoint 機制,在任務異常挂掉時可以恢複運作。Flink CDC 任務目前是運作在 Yarn 上。

應用實踐 | 物易雲通基于 Apache Doris 的實時資料倉庫建設業務背景數倉架構演進新架構的優勢系統重點功能新架構的收益問題與經驗寫在最後

image.png

資料計算

我們在資料易平台上開發了資料計算任務功能,使用者編寫 SQL 後,點選 SQL 解析,即可自動識别出腳本裡用到了哪些來源表,生成了哪些結果表,最終在海豚排程器裡生成對應的任務和上遊任務 Depend 關系。

應用實踐 | 物易雲通基于 Apache Doris 的實時資料倉庫建設業務背景數倉架構演進新架構的優勢系統重點功能新架構的收益問題與經驗寫在最後

image.png

說明: 為了保障各個 T+1 報表的資料一緻性,我們做了 ODS 層到 DWD 層的一套計算任務,即每天 0 點将 ODS 層中近 2 天的增量資料 insert into 到 DWD 層進行更新,後續 T+1 的計算任務統一從 DWD 層進行計算。

注意: 需要把實體删除變成邏輯删除,使用時剔除。如果直接在 ODS 裡面同步實體删除,會導緻 DWD 層裡無法通過增量方式同步删除。

新架構的收益

降低資源成本

目前我們的叢集配置為 5 台阿裡雲 ESC,16 核 64G。在相同叢集配置下,1000 個表的每日增量資料合并任務,用 Hive 需要 3-5 小時,用 Spark 需要 2-3 小時,然而同樣的需求 Drois 運用 Unique Key 模型完成隻需要 10 分鐘,大幅提前了後續計算任務的開始時間。

另外,因 Hive 跑得慢,我們後續的幾百個 Hive 計算任務,排隊情況很嚴重,不得不把一些優先級低的任務排到下午甚至晚上,日任務全部跑完需要十幾個小時。而我們把全部批任務遷移到 Doris 上計算後,全部任務跑完隻需要 2 小時不到,後續增加新的需求任務完全無壓力。

總而言之,使用 Doris 後,報表資料的更新時間大幅提前,臨時的資料查詢需求響應時長大幅縮短,至少節約了每年幾萬的大資料叢集擴容成本,同時獲得了各部門的認可。

提升開發效率

随着公司業務快速的發展,會不斷的有新的資料分析需求,就需要我們接入新庫新表,給老表加字段等,這對于 Hive 數倉是非常痛苦的,表要重建、全量資料要抽,這就需要每周有半天時間都在處理這些事情。

在使用 Doris 作為數倉後,通過我們的資料易平台配置 Flink CDC 任務快速接入 MySQL 庫表的全量 + 增量資料,同時利用 Doris 的 Online Schema Change 特性,實時同步 Binlog 裡的 DDL 表結構變更到 Doris,資料接入數倉零開發成本。

另外因為 Doris 支援 MySQL 協定直接對接資料可視化應用,我們不需要再把結果資料從 Hive 推到 MySQL 裡提供資料服務,節約了資料庫資源,減少了開發步驟。

展現資料價值

Doris 有審計日志,我們可以通過日志,分析出每個表每天的查詢使用情況,以便我們評估跟進資料價值、下線廢棄報表及任務。另外還可以預警資源消耗多、查詢慢的查詢語句,幫助使用者進行文法優化等。

問題與經驗

1、MySQL 和 Doris 字段類型不一緻 MySQL 的 Blob、Mediumint、Year、Text 等字段類型在 Doris 中沒有,需要我們轉換成 Doris 對應的字段類型,Varchar 的長度我們對應在 Doris 需擴大成 3 倍。

2、MySQL DDL 文法相容性問題 MySQL 的 Bigint Unsigned、AUTO_INCREMENT、CURRENT_TIMESTAMP 等文法在 Doris 裡不支援。

3、多個大表 Join 計算時,記憶體使用過大,導緻 BE 挂掉,影響資料寫入。 目前 Doris 新版本已對記憶體控制這部分進行優化。

4、Hive 和 Doris 差異 将 Hive 計算腳本改成 Doris 計算腳本時遇到一些文法問題,如:

  • Doris 不支援 Lateral View ,更新新版本已解決。
  • 之前的一些 Hive UDF 函數是 Java 寫的,Doris 不支援,我們用另外的程式對資料做的二次加工處理,後續 Doris 新版本會支援。
  • Doris 缺少一些函數,如 Last_Day 通過取日期下個月的第一天再減一天來實作, Collect_Set 通過先去重再 Group_Concat 實作等。

5、分析函數問題

  • 分析函數 XX () over (partition by) 在外層和子查詢中同時存在時,報 errCode = 2, detailMessage = can't support。我們通過将子查詢資料放入臨時表解決該問題,後面 Doris 1.0 版本已解決該問題。
  • 多個 lag PARTITION by 函數和 min PARTITION by 一起使用時,有亂碼的情況。撰文時該 Bug 已修複,等待合并發版。

6、Doris 動态分區 動态分區字段必須為 Date 到月、周、日,不能根據寫入的資料自動建立分區,目前我們通過建表時指定初始化的分區數解決此問題。

7、Stream Load 寫入過于頻繁報錯 Stream Load 寫入 Doris,寫入太頻繁會報錯誤碼 235 問題,同樣的表 Routine Load 不會出現這個問題,我們通過批量送出解決,Doris 新版本已優化該問題。

以上問題在向社群回報後,得到了社群的快速響應。截止目前,上述問題基本上都已經得到修複,并且将在即将釋出的新版中上線。

寫在最後

首先感謝 Apache Doris 社群的 PPMC 張家鋒和多個 Committer 的大力支援,有任何問題都能很快得到響應。也感謝公司上司對我們方案的認可和支援,做技術改造不僅要花費很多金錢和精力,而且還需改變的勇氣和堅定的信念。也感謝各位同行在使用 Apache Doris 上給了我們很多經驗和信心。最後祝願 Apache Doris 社群發展越來越好!

應用實踐 | 物易雲通基于 Apache Doris 的實時資料倉庫建設業務背景數倉架構演進新架構的優勢系統重點功能新架構的收益問題與經驗寫在最後