SparkSQL代码走读分析

举报
笨熊爱喝cola 发表于 2020/08/27 20:29:32 2020/08/27
【摘要】 以一条SQL语句为例,探寻SparkSQL中的代码调用

1.SparkSQL处理流程(Catalyst)

图1 SparkSQL处理流程

      SQL语句进入系统会被SQLContext中的sql函数进行处理,然后执行Spark任务,返回计算后的DataFrame。SQL语句首先通过Parser模块被解析为语法树,此棵树称为Unresolved Logical Plan;Unresolved Logical Plan通过Analyzer模块借助于Catalog中的表信息解析为Logical Plan;此时,Optimizer再通过各种基于规则的优化策略进行深入优化,得到Optimized Logical Plan;优化后的逻辑执行计划依然是逻辑的,并不能被Spark系统理解,此时需要将此逻辑执行计划转换为Physical Plan。

2.SQLText to Uresolved Logical Plan

(1)SQL查询语句:

select sum(chineseScore)
from (select x.id,x.chinese+20+30 as chineseScore,x.math from studentTable x inner join scoreTable y on x.id=y.sid)z 
where z.chineseScore <100

(2)调用ParseDriver类中的parsePlan()生成logicalplan

        ·1. 先调用SqlBaseParser类中的singleStatement()将sql语句转换成parse树(调用antlr)

        ·2. 再调用AstBuider中的visitSingleStatement()将parse树转换成AST树

图2 AST树(Unresolved Logical Plan)

3.unresolved logical plan to resolved logical plan

    调用Dataset类中的ofRaws()

(1)lazy执行analyzer,调用analyzer中的executeAndCheck()

(2)通过调用父类RuleExecutor中的excute()执行analyzer过程

(3)多次按照规则(RULER)转换,直到转换的树不再改变或者达到最大迭代次数

图3 resolved logical plan

4.Optimizer & Sparkplan

(1)调用QueryExecution类中的optimizedPlan()对resolved logical tree 进行优化(同analyzer)

(2)调用QueryPlanner类中的plan(),将logical树转换为physical树,并且选择最优的plan

     planner.plan(ReturnAnswer(optimizedPlan)).next()

(3)调用prepareForExecution(),将执行的SQL语句提前设定要执行的操作

(4)调用toRdd(),执行实际计算任务


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。