Hologres 揭秘:高性能原生加速 MaxCompute 核心原理
Hologres(中文名交互式分析)是阿里云自研的一站式實(shí)時數(shù)倉,這個云原生系統(tǒng)融合了實(shí)時服務(wù)和分析大數(shù)據(jù)的場景,全面兼容PostgreSQL協(xié)議并與大數(shù)據(jù)生態(tài)無縫打通,能用同一套數(shù)據(jù)架構(gòu)同時支持實(shí)時寫入實(shí)時查詢以及實(shí)時離線聯(lián)邦分析。它的出現(xiàn)簡化了業(yè)務(wù)的架構(gòu),與此同時為業(yè)務(wù)提供實(shí)時決策的能力,讓大數(shù)據(jù)發(fā)揮出更大的商業(yè)價值。從阿里集團(tuán)誕生到云上商業(yè)化,隨著業(yè)務(wù)的發(fā)展和技術(shù)的演進(jìn),Hologres也在持續(xù)不斷優(yōu)化核心技術(shù)競爭力,為了讓大家更加了解Hologres,我們計劃持續(xù)推出Hologres底層技術(shù)原理揭秘系列,從高性能存儲引擎到高效率查詢引擎,高吞吐寫入到高QPS查詢等,全方位解讀Hologres,請大家持續(xù)關(guān)注!
本期我們將帶來Hologres高性能原生加速查詢MaxCompute的技術(shù)原理解析。
隨著數(shù)據(jù)收集手段不斷豐富,行業(yè)數(shù)據(jù)大量積累,數(shù)據(jù)規(guī)模已增長到了傳統(tǒng)軟件行業(yè)無法承載的海量數(shù)據(jù)(TB、PB、EB)級別,MaxCompute(原名ODPS)也因此應(yīng)運(yùn)而生,致力于批量結(jié)構(gòu)化數(shù)據(jù)的存儲和計算,提供海量數(shù)據(jù)倉庫的解決方案及分析建模服務(wù),是一種快速、完全托管的EB級數(shù)據(jù)倉庫解決方案。
Hologres在離線大數(shù)據(jù)場景上與MaxCompute天然無縫融合,無需數(shù)據(jù)導(dǎo)入導(dǎo)出就能實(shí)現(xiàn)加速查詢MaxCompute,全兼容訪問各種MaxCompute文件格式,實(shí)現(xiàn)對PB級離線數(shù)據(jù)的毫秒級交互式分析。而這一切的背后,都離不開Hologres背后的執(zhí)行器SQE(S Query Engine),通過SQE實(shí)現(xiàn)對MaxCompute的Native訪問,然后再結(jié)合Hologres高性能分布式執(zhí)行引擎HQE的處理,達(dá)到極致性能。
Hologres加速查詢MaxCompute主要有以下幾個優(yōu)勢:
高性能:可以直接對MaxCompute數(shù)據(jù)加速查詢,具有亞秒級響應(yīng)的查詢性能,在OLAP場景可以直接即席查詢,滿足絕大多數(shù)報表等分析場景。
低成本:MaxCompute經(jīng)過數(shù)年的發(fā)展,用戶在MaxCompute上存儲了大量數(shù)據(jù),不需要冗余一份存儲可直接進(jìn)行訪問;另一方面用戶可以只需將部分高性能場景的數(shù)據(jù)遷移到SSD上,報表等分析場景的數(shù)據(jù)可以存儲在MaxCompute進(jìn)一步降低成本。
更高效:實(shí)現(xiàn)對MaxCompute的Native訪問,無需遷移和導(dǎo)入數(shù)據(jù),就可以高性能和全兼容的訪問各種MaxCompute文件格式,以及Hash/Range Clustered Table等復(fù)雜表,降低用戶的使用成本。
SQE 架構(gòu)介紹
如上圖所示是SQE的整體架構(gòu),可以看出整個架構(gòu)也是非常簡單。MaxCompute的數(shù)據(jù)統(tǒng)一存儲在Pangu,當(dāng)Hologres執(zhí)行一條Query去加速查詢MaxCompute的數(shù)據(jù)時,在Hologres端:
Hologres Frontend通過RPC向SQE Master請求獲取Meta等相關(guān)信息。
Hologres Blackhole 通過 RPC 向 SQE Executor 請求獲取具體的數(shù)據(jù)相關(guān)信息。
SQE由兩種角色的進(jìn)程組成:
SQE Master負(fù)責(zé)處理Meta相關(guān)的請求,主要負(fù)責(zé)獲取表、分區(qū)元數(shù)據(jù)、鑒權(quán)以及文件分片等功能。
SQE Executor作為SQE的核心,負(fù)責(zé)具體讀取數(shù)據(jù)請求,涉及Block Cache、預(yù)讀取、UDF 處理、表達(dá)式下推處理、索引處理、Metric、Meter等等功能。
MaxCompute外表引擎核心技術(shù)創(chuàng)新
基于SQE的架構(gòu),能做到對MaxCompute的數(shù)據(jù)高性能加速查詢,主要是基于以下技術(shù)創(chuàng)新優(yōu)勢:
1)抽象分布式外表
結(jié)合MaxCompute的分布式特性,Hologres抽象了一個分布式的外表,來支持訪問MaxCompute分布式數(shù)據(jù)。目前可支持訪問跨集群的MaxCompute分布式盤古文件,并按MaxCompute計算集群就近讀取。
2)和 MaxCompute Meta無縫互通,支持帶版本的元數(shù)據(jù)緩存
SQE和MaxCompute 的 Meta 無縫互通,可以做到 Meta 和 Data 實(shí)時獲取,支持通過Import Foreign Schema命令,自動同步MaxCompute的元數(shù)據(jù)到Hologres的外表,實(shí)現(xiàn)外表的自動創(chuàng)建,結(jié)構(gòu)自動更新。
3)支持UDF/表達(dá)式下推
SQE 通過支持 UDF/表達(dá)式下推,來實(shí)現(xiàn)用戶自定義的UDF計算;將表達(dá)式下推可以減少無用的數(shù)據(jù)傳輸帶來的開銷,進(jìn)一步提升性能。
4)異步ORC Reader,異步prefetch
目前MaxCompute大部分?jǐn)?shù)據(jù)為ORC格式,在Hologres V0.10及以上版本,Hologres更新了執(zhí)行引擎,使用異步 Reader 進(jìn)行更高效的異步讀取,還支持異步prefetch,進(jìn)一步降低讀取延遲;此外Hologres支持了 IO 合并、LazyRead、Lazy Decoding 等一些列的優(yōu)化技術(shù)手段,來降低在 IO 在整個查詢上的延遲,以帶來極致性能。
5)支持Block Cache
為了避免每次讀數(shù)據(jù)都用IO到文件中取,SQE同樣使用BlockCache把常用和最近用的數(shù)據(jù)放在內(nèi)存中,減少不必要的IO,加快讀的性能。在同一個節(jié)點(diǎn)內(nèi),通過一致性Hash實(shí)現(xiàn)將相同訪問的數(shù)據(jù)共享一個Block Cache。 比如在Scan 場景可帶來2倍以上的性能提升,大大提升查詢性能。
6)常駐進(jìn)程,減少調(diào)度開銷
傳統(tǒng)的進(jìn)程模型等架構(gòu)需要動態(tài)實(shí)時的創(chuàng)建進(jìn)程等調(diào)度操作,帶來了較大的調(diào)度開銷。SQE 采用常駐進(jìn)程模式,避免不必要的調(diào)度開銷,此外還可以大大提升Block Cache的命中率和有效使用率。
7)Network Shuffle,減少落盤開銷
Network Shuffle需要提供一種快速且穩(wěn)定的容錯機(jī)制。由于Network Shuffle必須保證發(fā)送端和接收端進(jìn)程同時alive才能完成數(shù)據(jù)shuffle。同樣的,如果采用傳統(tǒng)落盤的方式來進(jìn)行Network Shuffle的Retry,雖然能夠保證穩(wěn)定性,但是可能會在Retry過程中由于磁盤IO引入比較大的性能overhead。為了解決這個問題,我們優(yōu)化了分階段調(diào)度來解決快速穩(wěn)定的容錯問題。
MaxCompute外表引擎升級到HQE
上面提到了我們通過SQE進(jìn)行加速查詢MaxCompute外表,通過SQE查詢時性能可以做到很好,但是和Hologres交互時中間會有一層RPC 交互,在數(shù)據(jù)量較大時網(wǎng)絡(luò)會存在一定瓶頸。
因此我們基于Hologres已有的能力,在Hologres V0.10及以上版本我們對執(zhí)行引擎進(jìn)行了優(yōu)化,支持Hologres HQE查詢引擎直讀MaxCompute 表,在性能上得到進(jìn)一步的提升,較SQE方式讀取有 30%以上的性能提升。
這主要得益于以下幾個方面:
1) 節(jié)省了 SQE 和 Hologres中間 RPC 的交互,相當(dāng)于節(jié)省一次數(shù)據(jù)的序列化和反序列化,在性能上得到進(jìn)一步的提升。
2) 可以復(fù)用Hologres的Block Cache,這樣第二次查詢時無需訪問存儲,避免存儲IO,直接從內(nèi)存訪問數(shù)據(jù),更好的加速查詢。
3) 可以復(fù)用已有的Filter 下推能力,減少需要處理的數(shù)據(jù)量。
4) 在底層的IO層實(shí)現(xiàn)了預(yù)讀和Cache,更進(jìn)一步加速Scan時的性能。
以下是某客戶某實(shí)際在線業(yè)務(wù)查詢的性能數(shù)據(jù):
執(zhí)行817個SQL,總體性能提升70%,其中長 Query 提升80%以上。
說明:該優(yōu)化目前已在Hologres V0.10上線,歡迎點(diǎn)擊查看文檔使用。
MaxCompute加速場景選擇
在Hologres中加速查詢MaxCompute有兩種方式:
1)創(chuàng)建外表(數(shù)據(jù)還是存儲在MaxCompute中),性能相比在MaxCompute中查詢會有2-5倍的提升
2)導(dǎo)入內(nèi)表,性能相比外表約有10-100倍的提升
創(chuàng)建外表的方式其原理就是PostgreSQL中的Foreign Data Wrappers,通過外部訪問接口,來訪問存儲在外部的數(shù)據(jù)。建議您使用更方便的IMPORT FOREIGN SCHEMA 方式來創(chuàng)建外表,可以更好的簡化元數(shù)據(jù)的同步,無需關(guān)注字段類型映射等。
直接建外表并的方式實(shí)際上是利用查詢引擎的優(yōu)化能力來提高效率的,但是沒有利用到Hologres的索引能力。所以當(dāng)把外表導(dǎo)到內(nèi)表的時候,可以根據(jù)查詢的方式指定內(nèi)表的索引結(jié)構(gòu),通過這些索引能力帶來更高的查詢性能。這就是外表導(dǎo)入內(nèi)表,內(nèi)表的性能更好的原因,可以充分發(fā)揮數(shù)倉的索引優(yōu)化能力。
目前這兩種方式主要對比如下:
從上面對比可以看出:
如果您是數(shù)據(jù)量很大、對性能有很高的要求時(比如100ms內(nèi)等),對查詢延遲敏感,對查詢有SLA要求時,建議您將數(shù)據(jù)導(dǎo)入Hologres內(nèi)表,進(jìn)行查詢訪問。
如果是臨時性的探索性分析,或者對延遲不敏感的內(nèi)部業(yè)務(wù),可以使用MaxCompute外表方式,減少數(shù)據(jù)移動。
除上述場景外,您可以根據(jù)具體業(yè)務(wù)情況選擇合適的使用場景。
MaxCompute與Hologres的組合關(guān)系
上面介紹了很多Hologres外表查詢引擎如何加速查詢MaxCompute的場景,但并不是說所有類型的查詢都適合在Hologres的外表引擎上執(zhí)行。
Hologres是針對交互式分析場景設(shè)計的同步的查詢引擎,面向的是大數(shù)據(jù)進(jìn),小數(shù)據(jù)出的場景,典型用在Serving和Analytics的場景。而MaxCompute是針對海量數(shù)據(jù)加工處理處理場景設(shè)計的異步的數(shù)據(jù)加工引擎,面向的是大數(shù)據(jù)進(jìn),大數(shù)據(jù)出的場景,典型用在ETL的場景。在ETL的場景,作業(yè)異步提交,IO接口針對Scan優(yōu)化,計算過程需要節(jié)點(diǎn)的冗余設(shè)計支撐高可用,需要計算狀態(tài)落盤從而可以在失敗時自動重試,而這些都是Hologres不具備的能力。因此MaxCompute+Hologres組合在一起,形成了數(shù)據(jù)加工+服務(wù)的一站式體驗(yàn),減少了數(shù)據(jù)的隔離和冗余,可以為大數(shù)據(jù)數(shù)倉提供合理的解決方案架構(gòu),支撐實(shí)時離線一體化的開發(fā)體驗(yàn)。
總結(jié)
Hologres通過SQE與MaxCompute深度整合,充分利用Hologres和MaxCompute的優(yōu)勢,以極致性能為目標(biāo),直接就能加速查詢MaxCompute數(shù)據(jù),讓用戶更方便高效的進(jìn)行交互式分析,同時也降低了極大的分析成本,實(shí)現(xiàn)離線數(shù)倉服務(wù)一體化。