MaxCompute 中的Code Generation技术简介
摘要: 前言 在《數據庫系統(tǒng)中的Code Generation技術介紹》中,我們簡單介紹了一下Code Generation技術及其在大規(guī)模OLAP系統(tǒng),特別是大規(guī)模分布式OLAP系統(tǒng)中的重要性。MaxCompute采用了Code Generation技術來提高計算效率。在MaxCompute
前言
在《數據庫系統(tǒng)中的Code Generation技術介紹》中,我們簡單介紹了一下Code Generation技術及其在大規(guī)模OLAP系統(tǒng),特別是大規(guī)模分布式OLAP系統(tǒng)中的重要性。MaxCompute采用了Code Generation技術來提高計算效率。在MaxCompute2.0中,我們又引入了基于LLVM的JIT(Just In Time) Code Generation技術。結合向量化的執(zhí)行引擎,基于SIMD技術的執(zhí)行效率優(yōu)化等方式,較之MaxCompute 1.0,MaxCompute 2.0在性能方便有了較大的提升,具體可以參照《MaxCompute2.0性能評測:更強大、更高效之上的更快速》。
MaxCompute 1.0中的Code Generation
如上圖,MaxCompute 1.0采用了靜態(tài)的Code Generation技術,工作主要在MaxCompute控制集群中名為“Executor”的角色上完成。其流程如下:
用戶的SQL語句在Executor上經過Parsing和Optimization之后,生成對應的查詢計劃。
Executor調用g++將“mapred.cpp”編譯成一個動態(tài)庫,并將其下發(fā)到計算集群中的每一個Worker上。
被調度起來的Worker會Load該動態(tài)庫,調用相應的Process()方法以完成計算邏輯。
可以看到,利用Code Generation技術,對于每一個SQL來說執(zhí)行時代碼都是經過定制的,因此執(zhí)行效率較傳統(tǒng)的Volcano Model更好。但是,其中也有一些問題。
g++ 編譯還是比較消耗CPU/內存的,特別是當優(yōu)化選項開到O2以上的時候。特別是用戶SQL比較復雜的情況下(有些SQL在SELECT語句中有多達上千個表達式,或者表達式的嵌套計算特別深入),生成的C++源文件也比較大,編譯更加耗時。在實際生產中,我們見過編譯耗時數十秒,消耗上G內存的情況。
生成的動態(tài)庫在控制集群和計算集群之間傳輸也會有帶來一定的網絡開銷。因為這個動態(tài)庫的與SQL邏輯緊密相關的,因此無法復用,因此每個SQL都會經歷編譯,下發(fā)的過程,在任務提交比較頻繁的情況下,控制集群的穩(wěn)定性會收到一定挑戰(zhàn)。
因為較高的編譯時開銷,這種Code Generation的方式在處理復雜的語句加中小數據規(guī)模查詢的場景,比如service mode下,overhead太大。
MaxCompute 2.0中的Code Generation
MaxCompute 2.0采用了基于LLVM的JIT Code Generation技術。所謂JIT,就是程序在運行期間根據需要動態(tài)生成相應的機器指令。這樣,整個Code Generation的工作由控制集群移交到了真正執(zhí)行計算邏輯的計算集群各個Worker上。其流程如下:
和MaxCompute 1.0中一樣,用戶的SQL語句在Executor上經過Parsing和Optimization之后,生成對應的查詢計劃。
查詢計劃直接被發(fā)送到計算集群各個Worker上。
MaxCompute 2.0執(zhí)行引擎的Code Generation模塊Load查詢計劃,并利用LLVM C++ API生成相應的機器碼。Code Generation模塊返回一個函數指針作為調用的入口。
Worker通過調用Code Generation模塊返回的函數指針以完成計算邏輯。
與MaxCompute 1.0相比,MaxCompute 2.0中Code Generation速度有明顯提升。在1.0中,一個SQL的平均Code Generation耗時大概在2-3s左右,這個時間在2.0中被縮短到100 - 200ms。因為在2.0中Code Generation都在計算集群的Worker上完成,因此相對來說減輕了控制集群的壓力,有助于MaxCompute控制集群的穩(wěn)定性。此外,因為MaxCompute 2.0的執(zhí)行引擎是復用的(不因為SQL不同而不一樣),因此無需像1.0中一樣,在控制集群與計算集群之間傳輸動態(tài)庫,降低了控制集群與計算機群之間的網絡負載。
后續(xù)工作
目前,MaxCompute 2.0 的執(zhí)行引擎還是以Volcano Model為基礎。只是在Volcano Model中各個算子之間以Batch模式傳遞數據,并且以列式執(zhí)行的方式提高執(zhí)行速度。基于LLVM的JIT Code Generation現在主要用在表達式計算,Streamline等熱點部分。之后,我們準備嘗試Full Stage的Code Generation, 類似http://www.hyper-db.com/。 有興趣的同學可以看看這個:http://www.vldb.org/pvldb/vol4/p539-neumann.pdf。 附件中的PDF結合了《數據庫系統(tǒng)中的Code Generation技術介紹》和本文的部分內容,有興趣的同學可以作為參考。
原文鏈接
干貨好文,請關注掃描以下二維碼:
總結
以上是生活随笔為你收集整理的MaxCompute 中的Code Generation技术简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用NAT网关轻松为单台云服务器设置多个
- 下一篇: 手把手教您解决90%的自然语言处理问题