簡介:Hologres技術揭祕系列持續更新中,本期咱們將帶來Hologres高性能原生加速查詢MaxCompute的技術原理解析。
Hologres(中文名交互式分析)是阿里雲自研的一站式實時數倉,這個雲原生系統融合了實時服務和分析大數據的場景,全面兼容PostgreSQL協議並與大數據生態無縫打通,能用同一套數據架構同時支持實時寫入實時查詢以及實時離線聯邦分析。它的出現簡化了業務的架構,與此同時爲業務提供實時決策的能力,讓大數據發揮出更大的商業價值。從阿里集團誕生到雲上商業化,隨着業務的發展和技術的演進,Hologres也在持續不斷優化核心技術競爭力,爲了讓你們更加了解Hologres,咱們計劃持續推出Hologres底層技術原理揭祕系列,從高性能存儲引擎到高效率查詢引擎,高吞吐寫入到高QPS查詢等,全方位解讀Hologres,請你們持續關注!html
往期精彩內容:緩存
本期咱們將帶來Hologres高性能原生加速查詢MaxCompute的技術原理解析。網絡
隨着數據收集手段不斷豐富,行業數據大量積累,數據規模已增加到了傳統軟件行業沒法承載的海量數據(TB、PB、EB)級別,MaxCompute(原名ODPS)也所以應運而生,致力於批量結構化數據的存儲和計算,提供海量數據倉庫的解決方案及分析建模服務,是一種快速、徹底託管的EB級數據倉庫解決方案。架構
Hologres在離線大數據場景上與MaxCompute自然無縫融合,無需數據導入導出就能實現加速查詢MaxCompute,全兼容訪問各類MaxCompute文件格式,實現對PB級離線數據的毫秒級交互式分析。而這一切的背後,都離不開Hologres背後的執行器SQE(S Query Engine),經過SQE實現對MaxCompute的Native訪問,而後再結合Hologres高性能分佈式執行引擎HQE的處理,達到極致性能。併發
Hologres加速查詢MaxCompute主要有如下幾個優點:app
如上圖所示是SQE的總體架構,能夠看出整個架構也是很是簡單。MaxCompute的數據統一存儲在Pangu,當Hologres執行一條Query去加速查詢MaxCompute的數據時,在Hologres端:異步
基於SQE的架構,能作到對MaxCompute的數據高性能加速查詢,主要是基於如下技術創新優點:分佈式
1)抽象分佈式外表高併發
結合MaxCompute的分佈式特性,Hologres抽象了一個分佈式的外表,來支持訪問MaxCompute分佈式數據。目前可支持訪問跨集羣的MaxCompute分佈式盤古文件,並按MaxCompute計算集羣就近讀取。性能
2)和 MaxCompute Meta無縫互通,支持帶版本的元數據緩存
SQE和MaxCompute 的 Meta 無縫互通,能夠作到 Meta 和 Data 實時獲取,支持經過Import Foreign Schema命令,自動同步MaxCompute的元數據到Hologres的外表,實現外表的自動建立,結構自動更新。
3)支持UDF/表達式下推
SQE 經過支持 UDF/表達式下推,來實現用戶自定義的UDF計算;將表達式下推能夠減小無用的數據傳輸帶來的開銷,進一步提高性能。
4)異步ORC Reader,異步prefetch
目前MaxCompute大部分數據爲ORC格式,在Hologres V0.10及以上版本,Hologres更新了執行引擎,使用異步 Reader 進行更高效的異步讀取,還支持異步prefetch,進一步下降讀取延遲;此外Hologres支持了 IO 合併、LazyRead、Lazy Decoding 等一些列的優化技術手段,來下降在 IO 在整個查詢上的延遲,以帶來極致性能。
5)支持Block Cache
爲了不每次讀數據都用IO到文件中取,SQE一樣使用BlockCache把經常使用和最近用的數據放在內存中,減小沒必要要的IO,加快讀的性能。在同一個節點內,經過一致性Hash實現將相同訪問的數據共享一個Block Cache。 好比在Scan 場景可帶來2倍以上的性能提高,大大提高查詢性能。
6)常駐進程,減小調度開銷
傳統的進程模型等架構須要動態實時的建立進程等調度操做,帶來了較大的調度開銷。SQE 採用常駐進程模式,避免沒必要要的調度開銷,此外還能夠大大提高Block Cache的命中率和有效使用率。
7)Network Shuffle,減小落盤開銷
Network Shuffle須要提供一種快速且穩定的容錯機制。因爲Network Shuffle必須保證發送端和接收端進程同時alive才能完成數據shuffle。一樣的,若是採用傳統落盤的方式來進行Network Shuffle的Retry,雖然可以保證穩定性,可是可能會在Retry過程當中因爲磁盤IO引入比較大的性能overhead。爲了解決這個問題,咱們優化了分階段調度來解決快速穩定的容錯問題。
上面提到了咱們經過SQE進行加速查詢MaxCompute外表,經過SQE查詢時性能能夠作到很好,可是和Hologres交互時中間會有一層RPC 交互,在數據量較大時網絡會存在必定瓶頸。
所以咱們基於Hologres已有的能力,在Hologres V0.10及以上版本咱們對執行引擎進行了優化,支持Hologres HQE查詢引擎直讀MaxCompute 表,在性能上獲得進一步的提高,較SQE方式讀取有 30%以上的性能提高。
這主要得益於如下幾個方面:
1) 節省了 SQE 和 Hologres中間 RPC 的交互,至關於節省一次數據的序列化和反序列化,在性能上獲得進一步的提高。
2) 能夠複用Hologres的Block Cache,這樣第二次查詢時無需訪問存儲,避免存儲IO,直接從內存訪問數據,更好的加速查詢。
3) 能夠複用已有的Filter 下推能力,減小須要處理的數據量。
4) 在底層的IO層實現了預讀和Cache,更進一步加速Scan時的性能。
如下是某客戶某實際在線業務查詢的性能數據:
E2E運行時間 | SQL Num | SQE查詢性能(平均響應) | HQE查詢性能(平均響應) | 性能提高 |
2-10s | 547 | 4,956 ms | 2,609 ms | +47.34% |
10-30s | 207 | 16,757 ms | 5,457 ms | +67.43% |
30s以上 | 63 | 78,686 ms | 12,666 ms | +83.90% |
Total | 817 | 13,631 ms | 4,106 ms | +69.87% |
<span class="lake-fontsize-12">場景/維度</span> | <span class="lake-fontsize-12">性能</span> | <span class="lake-fontsize-12">存儲成本</span> | <span class="lake-fontsize-12">數據量</span> | <span class="lake-fontsize-12">索引</span> | <span class="lake-fontsize-12">便捷性</span> |
<span class="lake-fontsize-12">Hologres 內表</span> | <span>很是好</span> | <span>高</span><span>(SSD)</span> | <span>可支持PB級</span> | <span>可支持位圖、聚簇等多種索引</span> | <span>須要導入數據</span> |
<span class="lake-fontsize-12">Hologres 外表</span> | <span>較好</span> | <span>低</span><span>(HDD)</span> | <span>單次Query查詢200GB</span><span>限制</span> | <span>只支持ODPS索引</span> | <span>無需遷移和導入數據</span> |