執(zhí)行引擎
本文為您介紹Hologres的執(zhí)行引擎以及內(nèi)部的各組件。
執(zhí)行引擎優(yōu)勢(shì)
- 分布式執(zhí)行
執(zhí)行引擎是一個(gè)和存儲(chǔ)計(jì)算分離架構(gòu)配合的分布式執(zhí)行模型。執(zhí)行計(jì)劃由異步算子組成的執(zhí)行圖DAG(有向無(wú)環(huán)圖)表示,可以表達(dá)各種復(fù)雜查詢,并且完美適配Hologres的數(shù)據(jù)存儲(chǔ)模型,方便對(duì)接查詢優(yōu)化器,利用各種查詢優(yōu)化技術(shù)。
- 全異步執(zhí)行
端到端的全異步處理框架,可以避免高并發(fā)系統(tǒng)的瓶頸,充分利用資源,并且最大可能地避免存儲(chǔ)計(jì)算分離系統(tǒng)帶來(lái)的讀數(shù)據(jù)延遲的影響。
- 向量化和列處理
算子內(nèi)部處理數(shù)據(jù)時(shí)最大可能地使用向量化執(zhí)行,與存儲(chǔ)引擎深度集成,通過(guò)靈活的執(zhí)行模型,充分利用各種索引,最大化地延遲向量物化和延遲計(jì)算,避免不必要的讀數(shù)據(jù)和計(jì)算。
- 自適應(yīng)增量處理
對(duì)常見(jiàn)實(shí)時(shí)數(shù)據(jù)應(yīng)用查詢模式進(jìn)行自適應(yīng)增量處理。
- 特定查詢深度優(yōu)化
對(duì)一些特定查詢模式的獨(dú)特優(yōu)化。
Query執(zhí)行過(guò)程
- Frontend(FE)節(jié)點(diǎn)對(duì)SQL進(jìn)行解析和認(rèn)證,并分發(fā)至執(zhí)行引擎(Query Engine)的不同執(zhí)行模塊。
- 執(zhí)行引擎(Query Engine)會(huì)根據(jù)SQL的特征走不同的執(zhí)行路徑。
- 如果是點(diǎn)查/點(diǎn)寫(xiě)的場(chǎng)景,會(huì)跳過(guò)優(yōu)化器(Query Optimizer,QO),直接分發(fā)至后端獲取數(shù)據(jù),減少數(shù)據(jù)傳送鏈路,從而實(shí)現(xiàn)更優(yōu)的性能。整個(gè)執(zhí)行鏈路也叫Fixed Plan,點(diǎn)查(與HBase的KV查詢)、點(diǎn)寫(xiě)場(chǎng)景會(huì)直接走Fixed Plan。
- 如果是OLAP查詢和寫(xiě)入場(chǎng)景:首先會(huì)由優(yōu)化器(Query Optimizer,QO)對(duì)SQL進(jìn)行解析,生成執(zhí)行計(jì)劃,在執(zhí)行計(jì)劃中會(huì)預(yù)估出算子執(zhí)行Cost、統(tǒng)計(jì)信息、空間裁剪等。QO會(huì)通過(guò)生成的執(zhí)行計(jì)劃,決定使用HQE、PQE、SQE或者Hive QE對(duì)算子進(jìn)行真正的計(jì)算。HQE、PQE、SQE的對(duì)比介紹如下。
HQE(Hologres Query Engine)
Hologres自研執(zhí)行引擎,采用可擴(kuò)展的MPP架構(gòu)全并行計(jì)算,向量化算子發(fā)揮CPU極致算力,從而實(shí)現(xiàn)極致的查詢性能。(QE主要由HQE組成)。
PQE(Postgres Query Engine)
用于兼容Postgres提供擴(kuò)展能力,支持PG生態(tài)的各種擴(kuò)展組件,如PostGIS,UDF(PL/JAVA,PL/SQL,PL/Python)等。部分HQE還沒(méi)有支持的函數(shù)和算子,會(huì)通過(guò)PQE執(zhí)行,每個(gè)版本都在持續(xù)優(yōu)化中,最終目標(biāo)是去掉PQE。
SQE(Seahawks Query Engine)
無(wú)縫對(duì)接MaxCompute(ODPS)的執(zhí)行引擎,實(shí)現(xiàn)對(duì)MaxCompute的本地訪問(wèn),無(wú)需遷移和導(dǎo)入數(shù)據(jù),就可以高性能和全兼容的訪問(wèn)各種MaxCompute文件格式,以及Hash/Range clustered table等復(fù)雜表,實(shí)現(xiàn)對(duì)PB級(jí)離線數(shù)據(jù)的交互式分析,技術(shù)原理請(qǐng)參見(jiàn)Hologres加速查詢MaxCompute技術(shù)揭秘。
- 執(zhí)行引擎決定正確的執(zhí)行計(jì)劃,然后會(huì)通過(guò)存儲(chǔ)引擎(Storage Engine,SE)進(jìn)行數(shù)據(jù)獲取,最后對(duì)每個(gè)Shard上的數(shù)據(jù)進(jìn)行合并,返回至客戶端。