| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Spark SQL实现原理-逻辑计划优化的实现 -> 正文阅读 |
|
[大数据]Spark SQL实现原理-逻辑计划优化的实现 |
逻辑计划优化(Logical Optimization)阶段把标准的基于规则(Rule-based)的优化策略应用于已经分析的逻辑计划(Resolved Logical Plan)。 说明:为了对总体架构有一个更加宏观的掌握,所以逻辑计划分析规则的实现会在后续逐渐补上,先继续分析总体框架的实现。 优化规则的分类逻辑计划的默认优化规则集Optimizer#defaultBatches变量中定义。和逻辑计划的分析规则一样,逻辑计划的优化规则也通过规则集(Batch对象)的方式进行组织,每个规则集包括多个优化规则。 规则集的定义实现代码如下(有删减):
由于优化规则集比较多,有些场合下并非所有的规则集都需要用到,为了让用户可以排除掉一些不需要的规则集,Spark SQL添加了配置项: 通过排除优化规则的选项给了用户一定的控制权,但对于Spark SQL来说,有些优化规则是必须的,是不能去掉的。所以,Spark SQL在优化器中又定义了一个变量:nonExcludableRules,用来保存必须保留的优化规则。其代码实现(有删减)如下:
这样,最后被使用的规则集就是:
可以这么理解,原则上就是默认规则集减去用户配置的排除规则集,但系统保留的规则集不能排除,所以要从用户配置的列表中减去。换句话说,即使用户配置了要排除的规则集列表,但要是这些规则集在nonExcludableRules(系统保留规则集)中,它们也不会被排除。 操作优化规则集在优化规则集中,有一大类就是:操作优化规则集。操作优化规则集定义了对操作的各种优化,是非常重要的优化规则,我们在查看逻辑计划时也经常可以看到。操作优化规则集包括:
优化器:Optimizer实现逻辑计划规则优化的是Optimizer类对象,Optimizer是一个抽象父类,其实现类只有一个,就是:SparkOptimizer。而Optimizer类继承了RuleExecutor,这几者的关系如下:
各种逻辑计划的优化规则集是在抽象父类Optimizer中定义的,这样其实现类就可以直接使用这些规则。 逻辑计划优化的执行在前面的文章分析过,逻辑计划优化的执行的函数调用如下:
该函数最终调用的是父类的execute函数,也就是RuleExecutor中定义的execute函数。该函数的实现逻辑在《Spark SQL实现原理-逻辑计划分析的实现》一文中已经介绍过了。其大体思路就是:后续遍历逻辑计划树的每个节点,根据优化规则集和执行策略来处理逻辑计划树的每个节点,直到逻辑计划树不在变化或到达执行阈值就结束执行。具体的实现逻辑如下: 2.顺序遍历规则集中的每一个规则(Rule),并使用每一个规则来处理逻辑计划,每个处理结果传给下一个处理规则。 3.当一个规则集中的规则都遍历(使用)完成后,进行以下判断: ? 1)查看是否达到执行策略的阈值(迭代次数),若已经大于等于阈值,则不再遍历和执行当前规则集。 ? 2)查看使用本次规则集前后的逻辑计划是否相等,若相等说明不需要再执行当前规则集了。 满足1)和2)中的任意一个,直接跳到4执行,否则继续使用当前规则集。 4.遍历和使用下一个规则集的每个规则,并按第3步的逻辑进行处理。 如何编写优化规则除了Spark SQL自带的各种逻辑计划优化规则集,还可以自己编写优化规则,在《Spark SQL: Relational Data Processing in Spark》一文中介绍了一个自定义优化规则。 该规则的目的是:当将固定精度的 DECIMAL 类型添加到 Spark SQL 时,想优化小精 DECIMAL 上的求和和或平均值等聚合操作; 用 12 行代码编写了一个规则,在 SUM 和 AVG 表达式中找到这样的小数,并将它们转换为未缩放的 64 位 LONG,对其进行聚合,然后将结果转换回DECIMAL类型。
可以在规则中使用任意 Scala代码使得这些类型的优化变得容易表达,这些优化超越了子树结构的模式匹配。可见编写逻辑计划优化规则其实并不难,只要遵循以下接口的编写规范就可以。
但要想写好逻辑计划优化规则,首先需要熟悉现有的优化规则和各个逻辑计划节点,然后根据需求来进行抽象出需要优化的逻辑。 逻辑计划优化的查看可以通过几种方式来查看优化后的逻辑计划,通过scala终端来举例介绍一下。 (1)通过explain(true)来查看 通过explain(true)可以看到整个逻辑计划到物理计划的全过程:
另外,通过下面的命令可以看到逻辑计划节点和参数情况:
(2)通过queryExecution对象来查看 通过queryExecution可以只单独查看优化后的逻辑计划。
小结本文分析了逻辑计划优化的总体实现流程,并对实现自己的优化规则进行了简单的介绍,最后介绍如何查看逻辑计划优化的结果。逻辑计划的优化可以说是Catalyst项目的核心,接下来会通过一系列文章介绍各种逻辑计划优化规则的使用和实现原理。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 2:40:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |