SparkSQL优化器与执行流程

文章目录

    • Spark RDD执行流程
    • SparkSQL的自动优化
    • Catalyst优化器
    • SparkSQL的执行流程

Spark RDD执行流程

  • 如图所示:
    SparkSQL优化器与执行流程_第1张图片
  • 上图为RDD执行流程,主要的执行过程就是RDD代码→DAG调度器逻辑任务→Task调度器任务分配和管理监控→Worker工作。

SparkSQL的自动优化

  • RDD的运行会完全按照开发者的代码执行, 如果开发者水平有限,RDD的执行效率也会受到影响;而SparkSQL会对写完的代码,执行“自动优化”, 以提升代码运行效率,避免开发者水平影响到代码执行效率。
  • 为什么相比RDD,SparkSQL可以自动优化呢?
  • 答:RDD内含的数据类型不限格式和结构;而DataFrame是二维表结构,可以被优化,而SparkSQL的优化依赖于Catalyst优化器。

Catalyst优化器

  • 为了解决过多依赖Hive的问题,SparkSQL使用了一个新的SQL优化器代替Hive优化器。SparkSQL的架构如下图:
    在这里插入图片描述

    1. API层就是Spark会通过一些API接受SQL语句。
    2. 收到SQL之后,将其交给Catalyst,Catalyst负责解析SQL,生成执行计划。
    3. Catalyst的输出应该是RDD执行计划。
    4. 最终交给群集Cluster来运行。
  • 具体流程如下图:
    SparkSQL优化器与执行流程_第2张图片

    1. 解析SQL,并生成AST(抽象语法树)
      SparkSQL优化器与执行流程_第3张图片

    2. 在AST中加入元数据信息,这一步也是为了后续优化
      SparkSQL优化器与执行流程_第4张图片
      SparkSQL优化器与执行流程_第5张图片

    3. 对已加入元数据的AST,输入优化器,进行优化,常见的优化方式有两种如下图所示:
      SparkSQL优化器与执行流程_第6张图片
      断言下推,将Filter这种可以减少数据集的操作下推,放在Scan位置,为了减少操作时候的数据量。上述代码是先join再where,而下推之后先过滤age,再join,这样可以减小join数据量提升性能。
      SparkSQL优化器与执行流程_第7张图片
      列值裁剪,在断言下推之后进行裁剪,由于people表中只用到了id这一列,所以可以把其他列裁剪掉,从而做到减少数据量,优化处理速度。

    4. AST逻辑计划结束之后需要生成物理计划,从而生成RDD来进行后续的运行。我们可以通过queryExecution来查看逻辑执行计划;explain来查看物理执行计划。

  • 总体上看Catalyst两大方面优化:

    1. 断言下推:将逻辑判断提到前面,以减少shuffle阶段的数据量;简单点说就是行过滤,提前执行where。
    2. 列值裁剪:将加载的列进行裁剪,尽量减少被处理数据的宽度;简单点说就是列过滤,提前规划select字段的数量。(列值裁剪存储parquet)

SparkSQL的执行流程

SparkSQL优化器与执行流程_第8张图片

  1. 提交SparkSQL代码。
  2. Catalyst优化。
  3. Driver执行环境入口构建SparkSession。
  4. DAG调度器规划逻辑任务。
  5. TASK调度分区分配逻辑任务到具体的Executor上工作并监控管理任务。
  6. Worker执行工作。

你可能感兴趣的:(Spark,大数据,spark,hive)