Spark如何将字节码执行到机器代码指令运行时转换?

问题描述 投票:0回答:1

在阅读了一些关于Whole State Code Generation的文章后,spark会对字节码进行优化,以将查询计划转换为优化的执行计划。

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

现在我的下一个问题仍然是在完成与字节码相关的所有优化之后,将这些字节码指令转换为机器代码指令可能仍然是一个可能的瓶颈,因为这是在过程运行时期间由JIT单独完成的为了实现这种优化,JIT必须有足够的运行。

因此,spark执行与优化字节码(这是whole stage code gen的结果)到机器代码的动态/运行时转换相关的任何事情,或者它依赖于JIT将这些字节代码指令转换为机器代码指令。因为如果它依赖于JIT,则涉及某些不确定性。

apache-spark optimization code-generation bytecode jit
1个回答
3
投票

spark执行字节码优化,将查询计划转换为优化的执行计划。

Spark SQL不进行字节码优化。

Spark SQL只使用CollapseCodegenStages物理准备规则,最终将查询计划转换为single-method Java source code(即Janino compiles并生成字节码)。

因此,spark会执行与优化字节码的动态/运行时转换相关的任何事情

没有。


说到JIT,WholeStageCodegenExec does这会检查整个阶段的codegen是否会生成“太长的生成代码”,而不是spark.sql.codegen.hugeMethodLimit Spark SQL内部属性(默认情况下是8000并且是the value of HugeMethodLimit in the OpenJDK JVM settings)。

由整个阶段codegen生成的单个编译Java函数的最大字节码大小。当编译的函数超过此阈值时,将针对当前查询计划的此子树停用整阶代码生成器。默认值为8000,这是OpenJDK JVM实现中的限制。


没有那么多物理运营商支持CodegenSupport所以审查他们的doConsumedoProduce方法应该揭示是否JIT可能不会启动。

© www.soinside.com 2019 - 2024. All rights reserved.