Spark如何将字节码转换为机器码指令的运行时间转换?

Spark如何将字节码转换为机器码指令的运行时间转换?

问题描述:

在阅读了一些关于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实际上可能不会实际启动,这可能会使其在某些情况下变慢。那有意义吗 ? –

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。 –