1. RDD 和 SparkSQL 运行时的区别

查看执行计划----------------------explain

  • RDD的运行流程
  • sparksql 获取执行计划 sparksql执行原理_sparksql 获取执行计划

  • SparkSQL程序运行流程
  • sparksql 获取执行计划 sparksql执行原理_sparksql 获取执行计划_02

  • 和 RDD 不同, SparkSQL 的 Dataset 和 SQL 并不是直接生成计划交给集群执行, 而是经过了一个叫做 Catalyst 的优化器, 这个优化器能够自动帮助开发者优化代码
    也就是说, 在 SparkSQL 中, 开发者的代码即使不够优化, 也会被优化为相对较好的形式去执行
  • 为什么 SparkSQL 提供了这种能力?
    首先, SparkSQL 大部分情况用于处理结构化数据和半结构化数据, 所以 SparkSQL 可以获知数据的 Schema, 从而根据其 Schema 来进行优化

2.Catalyst优化器

简介: Spark SQL的核心是Catalyst优化器,它以一种新颖的方式利用高级编程语言功能(例如Scala的模式匹配和quasiquotes)来构建可扩展的查询优化器

sparksql 获取执行计划 sparksql执行原理_sparksql 获取执行计划_03


SparkSQL的Catalyst优化器是整个SparkSQL pipeline的中间核心部分,其执行策略主要两方向:

  1. 基于规则优化/Rule Based Optimizer/RBO
  2. 基于代价优化/Cost Based Optimizer/CBO

sparksql 获取执行计划 sparksql执行原理_数据_04

为了解决过多的依赖Hive的问题,SparkSQL引入了一个优化器 Catalyst, 整个 SparkSQL 的架构大致如下:

sparksql 获取执行计划 sparksql执行原理_数据_05


1.API 层简单的说就是 Spark 会通过一些 API 接受 SQL 语句

2.收到 SQL 语句以后, 将其交给 Catalyst, Catalyst 负责解析 SQL, 生成执行计划等

3.Catalyst 的输出应该是 RDD 的执行计划

4.最终交由集群运行具体流程:

sparksql 获取执行计划 sparksql执行原理_执行计划_06


Step 1 : 解析 SQL, 并且生成 AST (抽象语法树)

sparksql 获取执行计划 sparksql执行原理_SQL_07


Step 2 : 在 AST 中加入元数据信息, 做这一步主要是为了一些优化, 例如 col = col 这样的条件, 下图是一个简略图, 便于理解

sparksql 获取执行计划 sparksql执行原理_执行计划_08


Step 3 : 对已经加入元数据的 AST, 输入优化器, 进行优化, 从两种常见的优化开始, 简单介绍:

sparksql 获取执行计划 sparksql执行原理_执行计划_09


Step 4 : 上面的过程生成的 AST 其实最终还没办法直接运行, 这个 AST 叫做 逻辑计划, 结束后, 需要生成 物理计划, 从而生成 RDD 来运行在生成物理计划的时候, 会经过成本模型对整棵树再次执行优化, 选择一个更好的计划

在生成物理计划以后, 因为考虑到性能, 所以会使用代码生成, 在机器中运行

可以使用 queryExecution 方法查看逻辑执行计划, 使用 explain 方法查看物理执行计划

sparksql 获取执行计划 sparksql执行原理_数据_10


也可以使用 Spark WebUI 进行查看

sparksql 获取执行计划 sparksql执行原理_执行计划_11


总结:

Catalyst 的主要运作原理是分为三步, 先对 SQL 或者 Dataset 的代码解析, 生成逻辑计划, 后对逻辑计划进行优化, 再生成物理计划, 最后生成代码到集群中以 RDD 的形式运行

3.面试中如何回答?

sparksql 获取执行计划 sparksql执行原理_执行计划_12

  • 1-首先SaprkSQL底层解析成RDD,通过两个阶段RBO和CBO
  • 2-RBO就是通过逻辑执行计划通过常见的优化达到优化逻辑执行计划
  • 3-CBO就是从优化后的逻辑计划到物理执行计划