Spark SQL底层依然运行的是Spark RDD的程序,所以说Spark RDD程序的运行的流程,在Spark SQL中依然是存在的,只不过在这个流程的基础上增加了从SQL翻译为RDD的过程
Spark SQL的运行机制,其实就是在描述如何将Spark SQL翻译为RDD程序:
整个Spark SQL 转换为RDD 是基于Catalyst 优化器实施,基于这个优化器即可完成整个转换操作
Catalyst优化器内部具体的执行流程:
大白话:
SQL执行顺序: from->join on->where->groupby->聚合操作->having->select [distinct] ->order by ->limit
1- 接收客户端提交过来的SQL/DSL代码,首先会校验SQL/DSL的语法是否正常。如果通过校验,根据SQL/DSL的执行顺序,生成未解析的逻辑计划,也叫做AST抽象语法树 2- 对于AST抽象语法树加入元数据信息,确定一共涉及到哪些字段、字段的数据类型是什么,以及涉及到的表的其他相关元数据信息。加入元数据信息以后,就得到了(已经解析但是未优化的)逻辑计划 3- 对(未优化的)逻辑计划执行优化操作,整个优化通过优化器来执行。在优化器匹配相对应的优化规则,实时具体的优化。SparkSQL底层提供了一两百中优化规则,得到优化的逻辑计划。例如: 谓词下推(断言下推)、列值裁剪 3.1- 谓词下推: 也叫做断言下推。将数据过滤操作提前到数据扫描的时候执行,减少后续处理数据量,提升效率。 3.2- 列值裁剪: 在表中只加载数据分析用到的字段,不相关的字段不加载进来。减少后续处理数据量,提升效率。 4- 由于优化规则很多,导致会得到多个优化的逻辑计划。在转换成物理执行计划的过程中,会根据 成本模型(对比每个计划运行的耗时、资源消耗等)得到最优的一个物理执行计划 5- 将物理执行计划通过code generation(代码生成器),转变成Spark RDD的代码 6- 最后就是将Spark RDD代码部署到集群上运行。 后续过程与Spark内核调度中Job的调度流程完全一致。
专业的术语:
1- Spark SQL底层解析是由RBO(基于规则的优化器)和CBO(基于代价的优化器)优化完成的 2- RBO是基于规则优化,对于SQL或DSL的语句通过执行引擎得到未执行逻辑计划,在根据元数据得到逻辑计划,之后加入列值裁剪或谓词下推等优化手段形成优化的逻辑计划 3- CBO是基于优化的逻辑计划得到多个物理执行计划,根据 代价函数(成本模型) 选择出最优的物理执行计划 4- 通过code genaration代码生成器完成RDD的代码构建 5- 底层依赖于DAGScheduler和TaskScheduler完成任务计算执行 后续过程与Spark内核调度中Job的调度流程完全一致。