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(),执行实际计算任务
- 点赞
- 收藏
- 关注作者
评论(0)