Apache Doris:基于MPP架構(gòu)的實(shí)時(shí)分析數(shù)據(jù)庫,是時(shí)候上手了
Apache Doris 是一個(gè)基于 MPP 架構(gòu)的高性能實(shí)時(shí)分析數(shù)據(jù)庫,以極速和易用性著稱。海量數(shù)據(jù)下僅需亞秒級響應(yīng)時(shí)間即可返回查詢結(jié)果,不僅可以支持高并發(fā)點(diǎn)查詢場景,還可以支持高吞吐量的復(fù)雜分析場景?;诖?,Apache Doris可以更好的滿足報(bào)表分析、即席查詢、統(tǒng)一數(shù)倉、數(shù)據(jù)湖查詢加速等場景,用戶可以構(gòu)建用戶行為分析、AB測試平臺、日志檢索分析、用戶畫像分析、訂單分析,以及在此之上的其他應(yīng)用程序。
Apache Doris最早誕生于百度廣告報(bào)表業(yè)務(wù)的Palo項(xiàng)目,2017年正式開源,2018年7月由百度捐贈給Apache基金會孵化,在Apache導(dǎo)師的指導(dǎo)下,由孵化器項(xiàng)目管理委員會成員進(jìn)行孵化和運(yùn)營。Apache Doris 順利畢業(yè)于 Apache 孵化器,并于 2022 年 6 月成為頂級項(xiàng)目。目前,Apache Doris 社區(qū)聚集了來自不同行業(yè)近百家公司的 300 多名貢獻(xiàn)者,活躍貢獻(xiàn)者人數(shù)接近 100 人/月。
Apache Doris 目前在中國乃至全球擁有廣泛的用戶群,截至今天,Apache Doris 已在全球超過 500 家公司的生產(chǎn)環(huán)境中使用。中國互聯(lián)網(wǎng)市值或估值前50強(qiáng)企業(yè)中,80%以上長期使用Apache Doris百度、美團(tuán)、小米、京東、字節(jié)跳動、騰訊、網(wǎng)易、快手、微博等。它還廣泛應(yīng)用于金融、能源、制造、電信等一些傳統(tǒng)行業(yè)。
使用場景
如下圖所示,經(jīng)過各種數(shù)據(jù)整合和處理后,數(shù)據(jù)源通常存儲在實(shí)時(shí)數(shù)倉Doris和離線數(shù)據(jù)湖或數(shù)倉(Apache Hive、Apache Iceberg或Apache Hudi中)。
使用場景
Apache Doris 廣泛應(yīng)用于以下場景:
報(bào)告分析
- 實(shí)時(shí)儀表板
- 生成內(nèi)部分析師和經(jīng)理的報(bào)告
- 面向用戶或客戶的高并發(fā)報(bào)表分析:比如網(wǎng)站主 做站點(diǎn)分析,廣告主 做廣告報(bào)表等場景,并發(fā)通常需要上千QPS,查詢時(shí)延需要亞秒級響應(yīng)。著名電商京東在廣告報(bào)表中使用Doris,每天寫入100億行數(shù)據(jù),上萬并發(fā)查詢QPS,99%查詢延遲150ms。
即席查詢
面向分析師的具有不規(guī)則查詢模式和高吞吐量要求的的自助服務(wù)分析。小米基于Doris構(gòu)建了增長分析平臺(Growth Analytics,GA),利用用戶行為數(shù)據(jù)進(jìn)行業(yè)務(wù)增長分析,平均查詢延遲10秒,95%查詢延遲30秒以下,數(shù)萬每天的 SQL 查詢數(shù)。
統(tǒng)一數(shù)據(jù)倉庫建設(shè)
Doris 是一個(gè)滿足統(tǒng)一數(shù)據(jù)倉庫建設(shè)需求,簡化復(fù)雜數(shù)據(jù)軟件棧的平臺。海底撈基于Doris的統(tǒng)一數(shù)據(jù)倉庫取代了由Apache Spark、Apache Hive、Apache Kudu、Apache HBase、Apache Phoenix組成的舊架構(gòu),大大簡化了架構(gòu)。
數(shù)據(jù)湖查詢
通過使用外部表聯(lián)合位于 Apache Hive、Apache Iceberg 和 Apache Hudi 中的數(shù)據(jù),在避免數(shù)據(jù)復(fù)制的同時(shí)大大提高了查詢性能。
技術(shù)概覽
Apache Doris 的整體架構(gòu)如下圖所示。Doris 架構(gòu)非常簡單,只有兩類進(jìn)程。
- Frontend(FE):主要負(fù)責(zé)用戶請求接入、查詢解析和規(guī)劃、元數(shù)據(jù)管理、節(jié)點(diǎn)管理等相關(guān)工作。
- 后端(BE):主要負(fù)責(zé)數(shù)據(jù)存儲和查詢計(jì)劃執(zhí)行。
兩種類型的進(jìn)程都可以水平擴(kuò)展,單個(gè)集群最多可以支持?jǐn)?shù)百臺機(jī)器和數(shù)十 PB 的存儲容量。并且這兩類流程通過一致性協(xié)議保證了服務(wù)的高可用性和數(shù)據(jù)的高可靠性。這種高度集成的架構(gòu)設(shè)計(jì)大大降低了分布式系統(tǒng)的運(yùn)維成本。
Apache Doris 的架構(gòu)
Doris采用MySQL協(xié)議,高度兼容MySQL方言,支持標(biāo)準(zhǔn)SQL。用戶可以通過各種客戶端工具訪問Doris,支持與BI工具無縫對接。
在存儲引擎方面,Doris采用列式存儲對數(shù)據(jù)進(jìn)行按列編碼壓縮和讀取,在實(shí)現(xiàn)極高壓縮率的同時(shí)減少大量掃描無關(guān)數(shù)據(jù),從而更高效地利用IO和CPU資源.
Doris 還支持比較豐富的索引結(jié)構(gòu)來減少數(shù)據(jù)掃描:
- 支持排序復(fù)合鍵索引:最多可以指定三列組成復(fù)合排序鍵。有了這個(gè)索引,可以對數(shù)據(jù)進(jìn)行有效的剪枝,更好的支持高并發(fā)的上報(bào)場景。
- Z-order 索引:使用Z-order 索引,您可以高效地對架構(gòu)中的任意字段組合運(yùn)行范圍查詢。
- MIN/MAX 索引:有效過濾數(shù)字類型的等價(jià)和范圍查詢
- 布隆過濾器:對高基數(shù)列的等價(jià)過濾和修剪非常有效
- 倒排索引:它可以快速搜索任何字段
在存儲模型方面,Doris 支持多種存儲模型,針對不同場景有針對性的優(yōu)化:
- 聚合鍵模型:通過預(yù)先聚合來合并具有相同鍵的值列,以顯著提高性能。
- 唯一鍵模型:鍵是唯一的。具有相同鍵的數(shù)據(jù)將被覆蓋,以實(shí)現(xiàn)行級數(shù)據(jù)更新。
- 重復(fù)鍵模型:詳細(xì)的數(shù)據(jù)模型,可以滿足事實(shí)表的詳細(xì)存儲。
Doris 還支持強(qiáng)一致性物化視圖,物化視圖的更新和選擇在系統(tǒng)內(nèi)部自動完成,不需要用戶手動選擇,從而顯著降低了物化視圖的維護(hù)成本。
在查詢引擎方面,Doris采用了MPP模型,節(jié)點(diǎn)間和節(jié)點(diǎn)內(nèi)并行執(zhí)行,也支持多張大表的分布式shuffle join,可以更好的應(yīng)對復(fù)雜的查詢。
Apache Doris 的查詢引擎
Doris查詢引擎是向量化的,所有內(nèi)存結(jié)構(gòu)都可以以列格式布局,從而實(shí)現(xiàn)顯著減少虛擬函數(shù)調(diào)用、提高緩存命中率和高效使用SIMD指令。寬表聚合場景中的性能比非向量化引擎高 5-10 倍。
向量化查詢執(zhí)行器
Doris使用自適應(yīng)查詢執(zhí)行技術(shù),可以根據(jù)運(yùn)行時(shí)的統(tǒng)計(jì)動態(tài)調(diào)整執(zhí)行計(jì)劃,例如運(yùn)行時(shí)過濾器技術(shù),在運(yùn)行時(shí)生成過濾器推送到探測端,并自動將過濾器穿透到探測端,大大減少了探測端的數(shù)據(jù)量,提高了連接性能。Doris 的運(yùn)行時(shí)過濾器支持 In/Min/Max/Bloom 過濾器。
查詢優(yōu)化器
在優(yōu)化器方面,Doris 使用了 CBO 和 RBO 的組合,RBO 支持常量折疊、子查詢重寫、謂詞下推等,CBO支持 Join 重新排序。CBO仍在持續(xù)優(yōu)化中,主要集中在更準(zhǔn)確的統(tǒng)計(jì)信息收集和推導(dǎo)、更準(zhǔn)確的成本模型預(yù)測等方面。
未來,Apache Doris除了數(shù)據(jù)分析之外,還將提升數(shù)據(jù)工程能力,更好地覆蓋企業(yè)數(shù)據(jù)ETL/ELT場景,通過一個(gè)平臺滿足多種混合工作負(fù)載。另一方面,對云基礎(chǔ)設(shè)施做深度優(yōu)化,利用云提供的彈性和新硬件,提供性價(jià)比更好的產(chǎn)品。
為什么選擇 Apache Doris?
- 易于使用:兩個(gè)進(jìn)程,沒有其他依賴;在線集群伸縮,自動副本恢復(fù);兼容MySQL協(xié)議,使用標(biāo)準(zhǔn)SQL。
- 高性能:通過列式存儲引擎、現(xiàn)代 MPP 架構(gòu)、矢量化查詢引擎、預(yù)聚合物化視圖和數(shù)據(jù)索引,為低延遲和高吞吐量查詢提供極快的性能。
- 單一統(tǒng)一:單一系統(tǒng)可以支持實(shí)時(shí)數(shù)據(jù)服務(wù)、交互式數(shù)據(jù)分析和離線數(shù)據(jù)處理場景。
- 聯(lián)邦查詢:支持Hive、Iceberg、Hudi等數(shù)據(jù)湖和MySQL、Elasticsearch等數(shù)據(jù)庫的聯(lián)邦查詢。
- 多種數(shù)據(jù)導(dǎo)入方式:支持從HDFS/S3批量導(dǎo)入,從MySQL Binlog/Kafka流式導(dǎo)入;支持通過HTTP接口進(jìn)行微批量寫入,也支持在JDBC中使用Insert實(shí)時(shí)寫入。
- 豐富生態(tài): Spark使用Spark-Doris-Connector讀寫Doris;Flink-Doris-Connector 使 Flink CDC 能夠?qū)崿F(xiàn) Exactly-once 數(shù)據(jù)寫入 Doris;提供 DBT Doris Adapter 用于將 Doris 中的數(shù)據(jù)與 DBT 進(jìn)行轉(zhuǎn)換。