Apache Doris 是一個基于 MPP 架構(gòu)的高性能、實時的分析型數(shù)據(jù)庫,以極速易用的特點被人們所熟知,僅需亞秒級響應(yīng)時間即可返回海量數(shù)據(jù)下的查詢結(jié)果,不僅可以支持高并發(fā)的點查詢場景,也能支持高吞吐的復(fù)雜分析場景。基于此,Apache Doris 能夠較好的滿足報表分析、即席查詢、統(tǒng)一數(shù)倉構(gòu)建、數(shù)據(jù)湖聯(lián)邦查詢加速等使用場景,用戶可以在此之上構(gòu)建用戶行為分析、AB 實驗平臺、日志檢索分析、用戶畫像分析、訂單分析等應(yīng)用。
Apache Doris 最早是誕生于百度廣告報表業(yè)務(wù)的 Palo 項目,2017 年正式對外開源,2018 年 7 月由百度捐贈給 Apache 基金會進行孵化,之后在 Apache 導師的指導下由孵化器項目管理委員會成員進行孵化和運營。目前 Apache Doris 社區(qū)已經(jīng)聚集了來自不同行業(yè)近百家企業(yè)的 300 余位貢獻者,并且每月活躍貢獻者人數(shù)也接近 100 位。 2022 年 6 月,Apache Doris 成功從 Apache 孵化器畢業(yè),正式成為 Apache 頂級項目(Top-Level Project,TLP)
Apache Doris 如今在中國乃至全球范圍內(nèi)都擁有著廣泛的用戶群體,截止目前, Apache Doris 已經(jīng)在全球超過 500 家企業(yè)的生產(chǎn)環(huán)境中得到應(yīng)用,在中國市值或估值排行前 50 的互聯(lián)網(wǎng)公司中,有超過 80% 長期使用 Apache Doris,包括百度、美團、小米、京東、字節(jié)跳動、騰訊、網(wǎng)易、快手、微博、貝殼等。同時在一些傳統(tǒng)行業(yè)如金融、能源、制造、電信等領(lǐng)域也有著豐富的應(yīng)用。
使用場景
如下圖所示,數(shù)據(jù)源經(jīng)過各種數(shù)據(jù)集成和加工處理后,通常會入庫到實時數(shù)倉 Doris 和離線湖倉(Hive, Iceberg, Hudi 中),Apache Doris 被廣泛應(yīng)用在以下場景中。
- 報表分析
-
- 實時看板 (Dashboards)
- 面向企業(yè)內(nèi)部分析師和管理者的報表
- 面向用戶或者客戶的高并發(fā)報表分析(Customer Facing Analytics)。比如面向網(wǎng)站主的站點分析、面向廣告主的廣告報表,并發(fā)通常要求成千上萬的 QPS ,查詢延時要求毫秒級響應(yīng)。著名的電商公司京東在廣告報表中使用 Apache Doris ,每天寫入 100 億行數(shù)據(jù),查詢并發(fā) QPS 上萬,99 分位的查詢延時 150ms。
- 即席查詢(Ad-hoc Query):面向分析師的自助分析,查詢模式不固定,要求較高的吞吐。小米公司基于 Doris 構(gòu)建了增長分析平臺(Growing Analytics,GA),利用用戶行為數(shù)據(jù)對業(yè)務(wù)進行增長分析,平均查詢延時 10s,95 分位的查詢延時 30s 以內(nèi),每天的 SQL 查詢量為數(shù)萬條。
- 統(tǒng)一數(shù)倉構(gòu)建 :一個平臺滿足統(tǒng)一的數(shù)據(jù)倉庫建設(shè)需求,簡化繁瑣的大數(shù)據(jù)軟件棧。海底撈基于 Doris 構(gòu)建的統(tǒng)一數(shù)倉,替換了原來由 Spark、Hive、Kudu、Hbase、Phoenix 組成的舊架構(gòu),架構(gòu)大大簡化。
- 數(shù)據(jù)湖聯(lián)邦查詢:通過外表的方式聯(lián)邦分析位于 Hive、Iceberg、Hudi 中的數(shù)據(jù),在避免數(shù)據(jù)拷貝的前提下,查詢性能大幅提升。
Doris整體架構(gòu)如下圖所示,Doris 架構(gòu)非常簡單,只有兩類進程
- Frontend(FE),主要負責用戶請求的接入、查詢解析規(guī)劃、元數(shù)據(jù)的管理、節(jié)點管理相關(guān)工作。
- Backend(BE),主要負責數(shù)據(jù)存儲、查詢計劃的執(zhí)行。
這兩類進程都是可以橫向擴展的,單集群可以支持到數(shù)百臺機器,數(shù)十 PB 的存儲容量。并且這兩類進程通過一致性協(xié)議來保證服務(wù)的高可用和數(shù)據(jù)的高可靠。這種高度集成的架構(gòu)設(shè)計極大的降低了一款分布式系統(tǒng)的運維成本。
在使用接口方面,Doris 采用 MySQL 協(xié)議,高度兼容 MySQL 語法,支持標準 SQL,用戶可以通過各類客戶端工具來訪問 Doris,并支持與 BI 工具的無縫對接。
在存儲引擎方面,Doris 采用列式存儲,按列進行數(shù)據(jù)的編碼壓縮和讀取,能夠?qū)崿F(xiàn)極高的壓縮比,同時減少大量非相關(guān)數(shù)據(jù)的掃描,從而更加有效利用 IO 和 CPU 資源。
Doris 也支持比較豐富的索引結(jié)構(gòu),來減少數(shù)據(jù)的掃描:
- Sorted Compound Key Index,可以最多指定三個列組成復(fù)合排序鍵,通過該索引,能夠有效進行數(shù)據(jù)裁剪,從而能夠更好支持高并發(fā)的報表場景
- Z-order Index :使用 Z-order 索引,可以高效對數(shù)據(jù)模型中的任意字段組合進行范圍查詢
- Min/Max :有效過濾數(shù)值類型的等值和范圍查詢
- Bloom Filter :對高基數(shù)列的等值過濾裁剪非常有效
- Invert Index :能夠?qū)θ我庾侄螌崿F(xiàn)快速檢索
在存儲模型方面,Doris 支持多種存儲模型,針對不同的場景做了針對性的優(yōu)化:
- Aggregate Key 模型:相同 Key 的 Value 列合并,通過提前聚合大幅提升性能
- Unique Key 模型:Key 唯一,相同 Key 的數(shù)據(jù)覆蓋,實現(xiàn)行級別數(shù)據(jù)更新
- Duplicate Key 模型:明細數(shù)據(jù)模型,滿足事實表的明細存儲
Doris 也支持強一致的物化視圖,物化視圖的更新和選擇都在系統(tǒng)內(nèi)自動進行,不需要用戶手動選擇,從而大幅減少了物化視圖維護的代價。
在查詢引擎方面,Doris 采用 MPP 的模型,節(jié)點間和節(jié)點內(nèi)都并行執(zhí)行,也支持多個大表的分布式 Shuffle Join,從而能夠更好應(yīng)對復(fù)雜查詢。
Doris 查詢引擎是向量化的查詢引擎,所有的內(nèi)存結(jié)構(gòu)能夠按照列式布局,能夠達到大幅減少虛函數(shù)調(diào)用、提升 Cache 命中率,高效利用 SIMD 指令的效果。在寬表聚合場景下性能是非向量化引擎的 5-10 倍。
Doris 采用了 Adaptive Query Execution 技術(shù), 可以根據(jù) Runtime Statistics 來動態(tài)調(diào)整執(zhí)行計劃,比如通過 Runtime Filter 技術(shù)能夠在運行時生成生成 Filter 推到 Probe 側(cè),并且能夠?qū)?Filter 自動穿透到 Probe 側(cè)最底層的 Scan 節(jié)點,從而大幅減少 Probe 的數(shù)據(jù)量,加速 Join 性能。Doris 的 Runtime Filter 支持 In/Min/Max/Bloom Filter。
在優(yōu)化器方面 Doris 使用 CBO 和 RBO 結(jié)合的優(yōu)化策略,RBO 支持常量折疊、子查詢改寫、謂詞下推等,CBO 支持 Join Reorder。目前 CBO 還在持續(xù)優(yōu)化中,主要集中在更加精準的統(tǒng)計信息收集和推導,更加精準的代價模型預(yù)估等方面。