48

理解 Spark SQL 优化策略的最好方法就是自己实现一个

 5 years ago
source link: https://mp.weixin.qq.com/s/TzzHGBzFgguujb1qWRVnHA?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

spark sql 的优化框架 Catalyst 博大精深,里面的精华是很多大牛一个pr一个pr积累起来的,仔细琢磨琢 磨相关源码也是一件痛并快 乐的事情,spark 逻辑优化 就是在一个 AST 树上进行匹配,匹配到一定的规则,然后进行等价变换规则,从而使计算的成本更低,今天我带大家自己实现一个逻辑优化规则,帮助大家更快地理解spark sql 逻辑优化的底层原理, 如果对 spark sql 总体架构不了解的,可以先看这篇文章  是时候学习真正的spark技术了  了解全貌。

我们的例子非常简单,先注册一个表,包含一个 a 字段:

6BRraaq.png!web

我们看下当前的执行计划:

mAVNz2j.jpg!web

可以看到这个执行计划是比较费的, 因为对于   (a * 1) 这个算式来讲,其实就等于a本身,我们针对这种规则自定义一个 逻辑优化规则

qMnIBbf.jpg!web

iu6raiQ.jpg!web

上面的代码很好理解,如果匹 配到一个变量乘以1的表达式,就直接变换为变量本身, 应用完这个规则 (a#27 * 1) 就变为了 a#27:

FfQBF3u.jpg!web

这样就少了一次乘法运算,从而提高了性能。

上面我们是从内部测试,如果你在应用中要定义一个基于规则的优化,然后让这个优化策略自动应用到你写的sql中,可以如下方式定义

IfMnYfZ.jpg!web

sparkSession 中给用户留了扩展点,Spark catalyst的扩展点在SPARK-18127中被引入,Spark用户可以在SQL处理的各个阶段扩展自定义实现,非常强大高效

  • injectOptimizerRule – 添加optimizer自定义规则,optimizer负责逻辑执行计划的优化,我们例子中就是扩展了逻辑优化规则。

  • injectParser – 添加parser自定义规则,parser负责SQL解析。

  • injectPlannerStrategy – 添加planner strategy自定义规则,planner负责物理执行计划的生成。

  • injectResolutionRule – 添加Analyzer自定义规则到Resolution阶段,analyzer负责逻辑执行计划生成。

  • injectPostHocResolutionRule – 添加Analyzer自定义规则到Post Resolution阶段。

  • injectCheckRule – 添加Analyzer自定义Check规则。

其他几种扩展我们可以也会举例说明,今天只讲解一下怎么扩展逻辑优化规则。

大家都在看

关注 【spark技术分享】

一起撸spark源码,一起玩spark最佳实践

buYJbiV.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK