2017-12-18 288 views
0

在閱讀了一些關於Whole State Code Generation的文章之後,spark會執行字節碼優化以將查詢計劃轉換爲優化的執行計劃。現在Spark如何將字節碼轉換爲機器碼指令的運行時間轉換?

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-whole-stage-codegen.html

我的下一個問題是,但仍然在做這些優化相關的字節碼和所有以後,它仍然可能是合理的,因爲這樣做的這些字節碼指令的機器代碼指令的轉換可能是一個可能的瓶頸由JIT單獨在流程運行期間進行,並且爲了進行此優化,JIT必須有足夠的運行。

因此,spark是否會執行與優化字節碼(這是whole stage code gen的結果)到機器碼的動態/運行時轉換有關的任何內容,或者是否依賴於JIT將這些字節碼指令轉換爲機器碼指令。因爲如果它依賴於JIT,那麼涉及到一定的不確定性。

+0

另外一兩件事,我有些興趣在知道是,如果火花不做這種優化,那麼在某些情況下,與不進行字節碼優化的常規查詢引擎相比,它可能會變慢。原因是他們一次又一次地使用相同的代碼段,最終得到JIT優化(在熱路徑中),而SPARK可能永遠不會這樣做,因爲我們爲每種類型的查詢生成不同或優化的字節代碼。 –

+0

由於我是鏈接文章的作者,因此我對_「閱讀了關於整個州代碼生成的一些文章」感興趣_?我想閱讀他們更好地探索這個領域。 –

+0

沒有問題,但我的觀點再次表明,如果spark沒有執行機器代碼指令生成,那麼JIT實際上可能不會實際啓動,這可能會使其在某些情況下變慢。那有意義嗎 ? –

回答

3

spark會執行字節碼優化以將查詢計劃轉換爲優化的執行計劃。

Spark SQL does not do bytecode optimizations。

Spark SQL只是使用CollapseCodegenStages物理準備規則並最終將查詢計劃轉換爲single-method Java source code(即Janino compiles並生成字節碼)。

因此,沒有火花做好相關的優化代碼的動態/運行時轉換


JIT說到,任何WholeStageCodegenExecdoes此檢查整個階段的代碼生成是否生成「太長生成的代碼」或不可能高於spark.sql.codegen.hugeMethodLimit Spark SQL內部屬性(默認情況下爲8000並且是the value of HugeMethodLimit in the OpenJDK JVM settings)。

全階段代碼生成的單個編譯Java函數的最大字節碼大小。當編譯函數超過此閾值時,將停用當前查詢計劃的此子樹的全階段代碼生成器。默認值是8000,這是OpenJDK JVM實現中的一個限制。


有不支持CodegenSupport所以審查其doConsumedoProduce方法應顯示時是否在所有的JIT可能在沒有踢很多的物理運算符。

+0

感謝您的信息:) :)。是的,我實際上是指janino,它由spark sql在內部使用,用於生成優化的字節碼。 但實際上感謝讓我知道spark不會進行本地代碼優化。 –

+0

好像有一個上限,但它仍然不能回答我的問題,即使在某些情況下,JIT可能仍然不會啓動spark。 –