摘要:
在如今大数据时代,为了提升研发效率各个公司基本都是用sql进行数据开发,那么一条sql在提交后是怎样运行在spark中呢?回答以上问题需要先了解sql执行的主要流程,以及这个流程中每一步骤具体都是做什么的。
主要流程
语法树解析-逻辑分析-语法优化-计划执行
详细拆解如下步骤:
1、Unresolved Logical Plan阶段:此阶段是语法树的解析生成计划,关注查询的方式(什么样的查询,查询数据源在哪里)
2、AnalyzedLogicalPlan阶段:此阶段是通过Hive中元数据对Unresolved Logical Plan中涉及到的数据源Schema信息、地址进行校验,在进行优化(其中涉及到AQE:在shufflemap阶段完毕后 进行后续逻辑计划 物理执行优化的调整,还会涉及启发式规则:谓词下推、列剪裁和常量替换)
3、Optimized plan阶段:此阶段在Transform后的AnalyzedLogicalPlan后,根据规则进行转换,选取近似最优模型生成Physic plan (其中经历了优化Spark Plan(join策略)和生成Physical Plan(EnsureRequirements 添加操作符 排序 shuffle)。
4、Physic plan阶段:此阶段是进行转换RDD,生成DAG调度图。
注意:在生成物理逻辑计划(Physic Plan)后,此时的物理逻辑计划存在多个。Spark内部存在代价模型(CastModule),会对候选计划比对,选取消耗最小的Physic Plan。
5、DAG图生成:SparkPlan(物理计划)根据操作类型转换为RDD。
6、Stage划分:DAGScheduler会对DAG图拆分成不同Stage,拆分规则为是否Shuffle。
7、Task调度:Executor对job最小粒度task调度,分配Excutor。
8、Executor执行:执行计划的最后步骤,以Task粒度来执行DAG图。
提问:
大体的流程讲解完后,大家可以思考一个问题:在生成Physic plan 时,是如何选择合适的join策略的呢?欢迎评论区留言。