Spark内存计算框架
Spark SQL
SparkSQL架构设计
- SparkSQL 是 Spark 技术栈当中又一非常出彩的模块,通过引入 SQL 的支持,大大降低了开发人员和学习人员的使用成本,让我们开发人员直接使用 SQL 的方式就能够实现大数据的开发。
- 它同时支持 DSL 以及 SQL 的语法风格,目前在 spark 的整个架构设计当中,所有的 spark 模块,例如SQL、SparkML、sparkGrahpx 以及 Structed Streaming 等都是基于 Catalyst Optimization & Tungsten Execution模块之上运行,如下图所示就显示了 spark 的整体架构模块设计。

1. SparkSQL的架构设计实现
- 总的来讲,SparkSQL 执行会进过:
- SQL Parser 解析;
- Catalyst 优化器优化处理;
- Spark 执行
- 而 Catalyst 的过程又分为很多过程,其中包括:
- 由 SQL Parser 将 SQL 通过词法、语法解析(检查表、字段是否存在)生成未绑定的逻辑执行计划(Unresolved Logical plan);
- **Analyzer(分析器)**使用 Analysis Rules,配合元数据(Catalog 信息或 Hive Metastore 信息)将 Unresolved Logical plan 解析成 Analyzed logical plan(解析的逻辑计划);——解析SQL语句
- Logical Optimizer(逻辑计划调优器) 使用一些 Optimization Rules(调优规则:合并、列裁剪、过滤器下推等)将 Analyzed logical plan 解析成 Optimized Logical Plan(优化的逻辑计划);——逻辑计划调优过程
- Physical Planner(物理计划生成器) 使用 Planning Strategies:——物理执行计划
- 将前面的 optimized logical plan(还不能被 Spark 执行) 生成可执行的物理计划 physical plan;
- 这个过程是把 logical plan 转换成多个 physical plans;
- 根据过去的性能统计数据,利用代价模型(cost model),选择最佳的物理执行计划 physical plan。
- Code Generation(代码生成器):这个过程会把 SQL 查询生成 Java 字节码。——代码生成阶段

SELECT tmp.class, SUM(tmp.degree), AVG(tmp.degree)
FROM (
SELECT
students.sno AS ssno,
students.sname,
students.ssex,
students.sbirthday,
students.class,
scores.sno,
scores.degree,
scores.cno
FROM students
LEFT JOIN scores ON students.sno = scores.sno
WHERE degree > 60 AND sbirthday > '1973-01-01 00:00:00'
) tmp GROUP BY tmp.class
- 代码实现:通过 explain 方法来查看 sql 的执行计划
object Case14_DataFromMysqlPlan {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[*]")
val spark = SparkSession.builder().config(conf).getOrCreate()
spark.sparkContext.setLogLevel("WARN")
val url = "jdbc:mysql://192.168.254.132:3306/mydb?characterEncoding=UTF-8"
val props = new Properties()
props.setProperty("user", "root")
props.setProperty("password", "123456")
val studentDF: DataFrame = spark.read.jdbc(url, "students", props)
val scoreDF: DataFrame