Spark分布式内存计算框架-07 深入剖析 Spark SQL 架构与调优:执行流程、Catalyst机制与性能优化

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 = {
   
    // 1. 创建 SparkConf 对象
    val conf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[*]")

    // 2. 创建 SparkSession 对象
    val spark = SparkSession.builder().config(conf).getOrCreate()
    spark.sparkContext.setLogLevel("WARN")

    // 3. 读取 MySQL 表
    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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讲文明的喜羊羊拒绝pua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值