参考:1.一条 SQL 在 Apache Spark 之旅(下)https://www.iteblog.com/archives/2563.html
2.Spark Codegen浅析https://blog.youkuaiyun.com/weixin_45906054/article/details/103249183
3.Spark性能优化之Whole-stage code generationhttps://blog.youkuaiyun.com/zyzzxycj/article/details/82745336
仅用于自己学习记录用,有需要还是看原文吧
一、sparksql的优越性有两大技术支柱:Optimizer和Runtime
1.Optimizer寻找最优的执行计划
2.Runtime 把确定的执行计划近可能快的执行出来。
二、Runtime 分为两个层面:全局优化和局部优化
1.全局优化:从提升全局资源利用率、消除数据倾斜、降低io等角度做优化,如Adaptive Execution、Shuffle Removal
详情见 http://www.jasongj.com/spark/adaptive_execution/ Adaptive Execution 让 Spark SQL 更高效更智能
2.局部优化:优化具体的Task的执行效率,主要依赖Codegen技术,具体包括Expression级别和WholeStage级别的Codegen
Expression级别
表达式计算:x + (1 + 2),用scala代码表达如下:
Add(Attribute(x), Add(Literal(1), Literal(2)))
递归求值这棵语法树的常规代码如下:
tree.transformUp {
case Attribute(idx) => Literal(row.getValue(idx))
case Add(Literal(c1),Literal(c2)) => Literal(c1+c2)
case Lite