推荐阅读文章列表
前言
很多同学听到这个面试题,肯定就懵了,这不就是把一段SQL放在Spark环境执行,然后输出一个结果,面试官到底想要知道啥执行流程
今天就带着大家一起看看SparkSQL的执行流程到底是怎么回事
执行流程
我们应该了解Spark SQL和Spark Core之间的关系,Spark SQL构建在Spark Core之上,专门用来处理结构化数据,即Spark SQL是Spark Core封装而来的,因此底层会将SQL代码转换为RDD代码来执行
接下来我们看一个简单的案例
import org.apache.spark.sql.SparkSession
object Example {
def main(args: Array[String]): Unit = {
// 1、初始化SparkSession
val spark = SparkSession.builder().appName("Example").getOrCreate()
// 2、读取数据
// id name age
// 1 zhangsan 23
// 2 lisi 26
// 3 wangwu 27
spark.read.csv("student.csv").createOrReplaceTempView("student")
// 3、执行SQL查询语句
spark.sql("select id, name, age from student where age > 25").show(false)
}
}
一般来讲,SQL转换为RDD的执行主要包括逻辑计划和物理计划两大阶段
-
逻辑计划阶段: -
由SparkSqlParser中的AstBuilder执行节点访问,将语法树的各种Context节点转换成对应的LogicalPlan节点,从而成为一颗未解析的逻辑算子树(Unresolved LogicalPlan) -
由Analyzer将一系列的规则作用在Unresolved LogicalPlan上,对树上的节点绑定各种数据信息,生成解析后的逻辑算子树(Analyzed LogicalPlan) -
由SparkSQL中的优化器将一系列优化规则作用到上一步的逻辑算子树上,在确保结果正确的前提下改写其中的低效结构,生成优化后的逻辑算子树(Optimized LogicalPlan) -
物理计划阶段: -
由SparkPlanner将各种物理计划策略(Strategy)作用于对应的LogicPlan节点上,生成SparkPlan列表 -
选取最佳的SparkPlan,调用next方法获取第一个(Spark2.1版本) -
提交前进行准备工作,进行一些分区排序方面的处理,确保SparkPlan各节点能够正确执行,这一步通过prepareForExecution()方法调用若干规则(Rule)进行转换
再直接点说,这些SQL代码会转换成的RDD伪代码如下:
写在最后
V7.0笔记获取方式
公众号回复:大数据面试笔记

