導讀:物易云通目前已成為國內產融供應鏈運營服務平臺的領軍企業之一,平臺年交易額超過 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 可以很好地實現我們的業務需求。
架構方案對比
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,即最常見的全局庫名唯一。
另外還存在幾種其他的情況:
B、全局有多個名稱相同、結構不一致的數據庫。比如:部分大表做了數據切割歸檔到另一臺機器上了。 C、全局有多個名稱相同、結構一致的數據庫,即分庫。我們需要將數據合并到一個 Doris 庫表中,方便數據分析。 D、全局有多個名稱不同、結構一致的庫。比如:DB_租戶 A 的庫, DB_租戶 B 的庫,我們也是要把數據合并分析。
第二步,選擇 MySQL 庫實例,進行提交(如果不想接入全庫,可以勾選部分表)。對應的目標數據庫是 Doris 里面的 ODS 貼源層,和生產數據保持一致,一個庫一個任務,可以視情況調整內存等參數。
注意:通過列表可以進行任務管理,恢復任務是運用了 Flink CDC 的 Checkpoint 機制,在任務異常掛掉時可以恢復運行。Flink CDC 任務目前是運行在 Yarn 上。
數據計算
我們在數據易平臺上開發了數據計算任務功能,用戶編寫 SQL 后,點擊 SQL 解析,即可自動識別出腳本里用到了哪些來源表,生成了哪些結果表,最終在海豚調度器里生成對應的任務和上游任務 Depend 關系。
說明:為了保障各個 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 社區發展越來越好!
SelectDB 是一家開源技術公司,致力于為 Apache Doris 社區提供一個由全職工程師、產品經理和支持工程師組成的團隊,繁榮開源社區生態,打造實時分析型數據庫領域的國際工業界標準。基于 Apache Doris(incubating)研發的新一代云原生實時數倉 SelectDB,運行于多家云上,為用戶和客戶提供開箱即用的能力。