SparkSQL优化器与执行流程

Spark RDD执行流程

  • 如图所示:
    在这里插入图片描述
  • 上图为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来运行。
  • 具体流程如下图:
    在这里插入图片描述

    1. 解析SQL,并生成AST(抽象语法树)
      在这里插入图片描述

    2. 在AST中加入元数据信息,这一步也是为了后续优化
      在这里插入图片描述
      在这里插入图片描述

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

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

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

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

SparkSQL的执行流程

在这里插入图片描述

  1. 提交SparkSQL代码。
  2. Catalyst优化。
  3. Driver执行环境入口构建SparkSession。
  4. DAG调度器规划逻辑任务。
  5. TASK调度分区分配逻辑任务到具体的Executor上工作并监控管理任务。
  6. Worker执行工作。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值