Apache Doris是一個高效能、即時的AnalyticDB,能夠較好的滿足報表分析、即席查詢、資料湖聯邦查詢加速等使用情境。本文為您介紹Apache Doris。
使用情境
資料來源經過各種Data Integration和加工處理後,通常會入庫到即時數倉Doris和離線湖倉(Hive、Iceberg和Hudi中),如下圖所示。
Apache Doris被廣泛應用在以下情境中。
報表分析
即席查詢(Ad-hoc Query):面向分析師的自助分析,查詢模式不固定,要求較高的吞吐。
統一數倉構建:一個平台滿足統一的資料倉儲建設需求,簡化繁瑣的巨量資料軟體棧。基於Doris構建的統一數倉,替換了原來由Spark、Hive、Kudu、Hbase、Phoenix組成的舊架構,架構大大簡化。
資料湖聯邦查詢:通過外表的方式聯邦分析位於Hive、Iceberg、Hudi中的資料,在避免資料拷貝的前提下,查詢效能大幅提升。
技術概述
Doris整體架構如下圖所示。
Doris架構非常簡單,只有兩類進程:
這兩類進程都是可以橫向擴充的,單叢集可以支援到數百台機器,數十 PB的儲存容量。並且這兩類進程通過一致性協議來保證服務的高可用和資料的高可靠,這種高度整合的架構設計極大的降低了一款分布式系統的營運成本。
從以下五個方面介紹Doris技術:
在使用介面方面,Doris採用MySQL協議,高度相容MySQL文法,支援標準SQL,您可以通過各類用戶端工具來訪問Doris,並支援與BI工具的無縫對接。
在儲存引擎方面,Doris採用列式儲存,按列進行資料的編碼壓縮和讀取,能夠實現極高的壓縮比,同時減少大量非相關資料的掃描,從而更加有效利用IO和CPU資源。
Doris也支援比較豐富的索引結構,來減少資料的掃描:
Sorted Compound Key Index:可以最多指定三個列組成複合排序鍵,通過該索引,能夠有效進行資料裁剪,從而能夠更好支援高並發的報表情境。
Z-order Index:使用Z-order索引,可以高效對資料模型中的任意欄位組合進行範圍查詢。
Min/Max:有效過濾數實值型別的等值和範圍查詢。
Bloom Filter:對高基數列的等值過濾裁剪非常有效。
Invert Index:能夠對任意欄位實現快速檢索。
在儲存模型方面,Doris支援多種儲存模型,針對不同的情境做了針對性的最佳化:
Aggregate Key模型:相同Key的Value列合并,通過提前彙總大幅提升效能。
Unique Key模型:Key唯一,相同Key的資料覆蓋,實現行層級資料更新。
Duplicate Key模型:詳細資料模型,滿足事實表的明細儲存。
Doris也支援強一致的物化視圖,物化視圖的更新和選擇都在系統內自動進行,不需要您手動選擇,從而大幅減少了物化視圖維護的代價。
在查詢引擎方面,Doris採用MPP的模型,節點間和節點內都並存執行,也支援多個大表的分布Shuffle Join,從而能夠更好應對複雜查詢,查詢引擎如下圖所示。
Doris查詢引擎是向量化的查詢引擎,所有的記憶體結構能夠按照列式布局,能夠達到大幅減少虛函數調用、提升Cache命中率,高效利用SIMD指令的效果。在寬表彙總情境下效能是非向量化引擎的5-10倍。
在最佳化器方面Doris使用CBO和RBO結合的最佳化策略,RBO支援常量摺疊、子查詢改寫、謂詞下推等,CBO支援Join Reorder。目前CBO還在持續最佳化中,主要集中在更加精準的統計資訊收集和推導,更加精準的代價模型預估等方面。
Doris採用了Adaptive Query Execution技術,可以根據Runtime Statistics來動態調整執行計畫,比如通過Runtime Filter技術能夠在運行時產生Filter推到Probe側,並且能夠將Filter自動穿透到Probe側最底層的Scan節點,從而大幅減少Probe的資料量,加速Join效能,流程圖如下所示。
Doris的Runtime Filter支援In、Min、Max和Bloom Filter。