Spark 如何做字节码到机器码指令运行时的转换?

mri*_*rma 0 optimization jit code-generation bytecode apache-spark

在阅读了一些关于 的文章后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,那么就会涉及某些不确定性。

Jac*_*ski 5

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

星火SQL并没有做字节码优化。

Spark SQL 简单地使用CollapseCodegenStages物理准备规则,并最终将查询计划转换为单方法 Java 源代码(由Janino 编译并生成字节码)。

spark 做任何与优化字节码的动态/运行时转换相关的事情

不。


说到JIT的,WholeStageCodegenExec 确实这个检查整段代码生成是否生成“太长生成的代码”与否,可能是上述spark.sql.codegen.hugeMethodLimit星火SQL内部属性(在默认情况下是8000,是HugeMethodLimit中的价值OpenJDK JVM 设置)。

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


支持CodegenSupport 的物理操作符并不多,因此检查它们doConsumedoProduce方法应该会发现 JIT 是否可能不会启动。