【Spark精讲】一文讲透SparkSQL执行过程

SparkSQL执行过程

逻辑计划

逻辑计划阶段会将用户所写的 SQL语句转换成树型数据结构(逻辑算子树), SQL语句中蕴含的逻辑映射到逻辑算子树的不同节点。 顾名思义,逻辑计划阶段生成的逻辑算子树并不会直接提交执行,仅作为中间阶段 。 最终逻辑算子树的生成过程经历 3 个子阶段,分别对应未解析的逻辑算子树( Unresolved LogicalPlan,仅仅是数据结构,不包含任何数据信息等 )、解析后的逻辑算子树( Analyzed LogicalPlan,节点中绑定各种信息)和优化后的逻辑算子树(Optimized LogicalPlan,应用各种优化规则对一 些低效的逻辑计划进行转换) 。

Spark SQL 逻辑计划在实现层面被定义为 LogicalPlan 类。 从 SQL 语句经过 SparkSqlParser 解析生成 Unresolved LogicalPlan,到最终优化成为 Optimized LogicalPlan,这个流程主要经过 3 个阶段,如上图所示。 这 3 个阶段分别产生 Unresolved LogicalPlan, Analyzed LogicalPlan 和 Optimized LogicalPlan,其中 OptimizedLogicalPlan传递到下一个阶段用于物理执行计划的生戚。

具体来讲,这 3 个阶段所完成的工作分别如下 。

(1)由 SparkSqlParser 中的 AstBuilder执行节点访问,将语法树的各种Context节点转换成对应的 LogicalPlan 节点,从而成为一棵未解析的逻辑算子树(Unresolved LogicalPlan),此时的逻辑算子树是最初形态,不包含数据信息与列信息等。

(2)由 Analyzer将一系列的规则作用在 Unresolved LogicalPlan 上,对树上的节点绑定各种数据信息,生成解析后的逻辑算子树(Analyzed LogicalPlan)。

(3)由 SparkSQL中的优化器(Optimizer)将一系列优化规则作用到上一步生成的逻辑算子树中,在确保结果正确的前提下改写其中的低效结构,生成优化后的逻辑算子树(Optimized LogicalPlan) 。

Optimizer 优化举例:

  • ReplaceDistinctWithAggregate:该优化规则会将 Distinct算子转换为 Aggregate语句 。 在某 些 SQL 语句中, Select直接进行 Distinct操作,这种情况下可以将其直接转换为聚合操作。 ReplaceDistinctWithAggregate规则会将Distinct算子替换为对应的GroupBy语句。
  • Batch Operator Optimizations:类似 Analyzer 中的 Operator解析规则,该 Batch包含了 Optimizer 中数量最多同时也是最常用的各种优化规则,共 31 条 。 从整体来看,这 31 条优化规则(如表 5.4 所示)可以分为 3 个 模块:算子下推( Operator Push Down)、算子组合( Operator Combine)、常量折叠与长度削减 (Constant Folding and Strength Reduction) 。

  • EXISTS和NOTEXISTS算子分别对应semi和anti类型的Join,过滤条件会被当作Join的条件; IN 和 NOT IN 也分别对应 semi 和 anti 类型的 Join。

物理计划

物理计划阶段将上一步逻辑计划阶段生成的逻辑算子树进行进一步转换,生成物理算子树。 物理算子树的节点会直接生成 RDD 或对 RDD 进行 transformation 操作(注:每个物理计划节点中都实现了对 RDD 进行转换的 execute 方法) 。 同样地,物理计划阶段也包含 3 个子阶段:首 先,根据逻辑算子树,生成物理算子树的列表 Iterator[PhysicalPlan] (同样的逻辑算子树可能对 应多个物理算子树);然后,从列表中按照一定的策略选取最优的物理算子树(SparkPlan);最 后,对选取的物理算子树进行提交前的准备工作,例如,确保分区操作正确、物理算子树节点 重用、执行代码生成等,得到“准备后”的物理算子树(PreparedSparkPlan)。 经过上述步骤后,物理算子树生成的 RDD 执行 action操作(如例子中的 show),即可提交执行 。

从 SQL语句的解析一直到提交之前,上述整个转换过程都在 Spark集群的 Driver端进行, 不涉及分布式环境 。 SparkSession 类的 sql方法调用 SessionState 中的各种对象 ,包括上述不同阶段对应的 SparkSqlParser类、 Analyzer类、 Optimizer类和 SparkPlanner类等 ,最后封装成一个 QueryExecution对象。 因此,在进行 SparkSQL开发时,可以很方便地将每一步生成的计划单独剥离出来分析 。

回到前面的案例, SQL语句较为简单(不包含 Join 和 Aggregation 等操作),因此其转换过程也相对简单。 如图下图所示,左上角是 SQL 语句,生成的逻辑算子树中有 Relation、 Filter 和 Project节点,分别对应数据表、过滤逻辑(age>l8)和列剪裁逻辑 (只涉及3列中的2列)。 下一步的物理算子树从逻辑算子树一对一映射得到, Relation逻辑节点转换为 FileSourceScanExec 执行节点,Project逻辑节点转换为 FilterExec执行节点, Project逻辑节点转换为 ProjectExec执行节点。

生成的物理算子树根节点是 ProjectExec,每个物理节点中的 execute 函数都是执行调用接口,由根节点开始递归调用,从叶子节点开始执行。上图下方展示了物理算子树的执行逻辑,与直接采用 RDD进行编程类似。需要注意的是,FileSourceScanExec叶子执行节点中需要构造数据源对应的 RDD, FilterExec 和 ProjectExec 中的 execute 函数对 RDD 执行相应的transformation 操作。

总的来看, SQL转换为RDD在流程上比较清晰。 虽然实际生产环境中的SQL语句非常复杂,涉及的映射操作也比较烦琐,但总体上仍然遵循上述步骤。

(1)由 SparkPlanner 将各种物理计划策略( Strategy)作用于对应的 LogicalPlan 节点上,生成 SparkPlan列表(注: 一个 LogicalPlan可能产生多种 SparkPlan)。

(2)选取最佳的 SparkPlan,在 Spark2.1 版本中的实现较为简单,在候选列表中直接用 next() 方法获取第一个。

(3)提交前进行准备工作,进行一些分区排序方面的处理,确保 SparkPlan各节点能够正确执行,这一步通过 prepareForExecution()方法调用若干规则(Rule)进行转换。

类继承关系

行数据

TreeNode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 设置文件夹隐藏

在C#中,你可以使用DirectoryInfo类的Attributes属性来设置文件夹的隐藏属性。以下是一个示例代码: using System; using System.IO;class Program {static void Main(string[] args){string folderPath "你的文件夹路径"; // 替换为你要隐藏…

二、KMDF开发之HelloWord

目录 第一步、创建KMDF项目 第二步、代码里增加打印信息 最终我们是要自己开发PCIE驱动,这里使用HelloWord工程把整个环境打通,下一篇将讲KMDF双机调试环境的搭建,开发环境的搭建见上一篇博文《一、KMDF开发之环境搭建-CSDN博客》。 第一步…

关键字:abstract关键字

在 Java 中,abstract是一个关键字,用于修饰类和方法。当一个类被声明为抽象类时,它不能被实例化,只能被其他类继承。同时,抽象类可以包含抽象方法,抽象方法没有方法体,只包含方法的签名&#xf…

docker-compose 安装gitlab

写在前面的话:docker-compose的文件是通用的,因此可以切换任意版本的gitlab的镜像版本。 往期docker-compose部署系列如: docker-compose语法格式docker-compose部署openldapdocker-compose 安装Sonar并集成gitlab 文章目录 1. 参考文档2. 环…

java spring boot 自定义 aop

以一个锁的加锁和释放为例 1、先定义注解 /*** 锁切面* author fmj*/ Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface VersionLockAOP { }2、然后定义切面类以及切点 /*** 切面*/ Component Aspect Slf4j public class VersionLockAOPAspe…

Spring AOP<一>简介与基础使用

spring AOP 基础定义 含义使用切面组织多个Advice,Advice放在切面中定义。也就是说是定义通知的自定义类。自定义的AOP类Aspect连接点方法调用,异常抛出可以增强的点JoinPoint :也就是**被增强的方法的总称,可以获取具体方法的信息&#xff…

SSRF靶场安装测试记录

目录 环境 靶场介绍 1. 获取并显示指定文件内容的应用程序代码

Navicat删除连接报错:service in use cannot be deleted的解决方法

我在删除连接时遇到了这个报错,内容如图。下面我介绍两种解决方法,非常简单。 第一种 右键点击想要删除的连接,先选择“关闭连接”。再选择“删除连接” 第二种 如果第一种方法无效,直接关闭Navicat软件,重新打开。然后…

WPF 基础入门(样式)

3.1 一般样式 <Grid Margin"10"><TextBlock Text"Style test" Foreground"Red" FontSize"20"/> </Grid> 3.2内嵌样式 直接在控件上定义样式&#xff0c;如下所示&#xff1a; <Grid Margin"10">…

【c/c++】指针例图基础详解

文章目录 指针变量内存指针详解例1例2练习&答案解析 指针变量内存 int main(){// 各类型变量占字节数printf("char: %d\n",sizeof(char)); // 1printf("short: %d\n",sizeof(short)); // 2printf("int: %d\n",sizeof(int)); // 4pri…

uniapp多级动态表单规则

最近有个新的业务、主要涉及多层级的动态表单提交&#xff0c;其中又涉及很多类型&#xff0c;踩了很多坑之后&#xff0c;终于研发完毕。 传来的数据格式处理 传来的数据格式涉及比较多的内容&#xff0c;以下举例一个&#xff0c;涉及到规则的填写 规则写法有两种&#xff…

算法基础之蒙德里安的梦想

蒙德里安的梦想 核心思想&#xff1a; 状态压缩dp 总方案 横放的方案 剩下的地方竖着放是固定的了 状态压缩 &#xff1a; 将每一列的图(横终点 横起点 竖) 用一个二进制数存下 向后凸的为1 反之为0 状态计算&#xff1a; 所有 i – 1 列 不冲突的 都加和 f[i , j] f[i - 1…

lodop打印控件使用

功能演示 - Lodop和C-Lodop官网主站 云官网 : Lodop和C-Lodop官网主站 官网 : Lodop和C-Lodop官网主站 &#xff08;建议网速不怎么样的&#xff0c;不要使用这个网站了&#xff09; 这个就不用多讲了&#xff0c;当然云官网的速度要快一些&#xff0c;里面的内容展示方式都是…

小程序域名SSL证书能否用免费的?

在小程序开发中&#xff0c;确保通信安全性是至关重要的一环&#xff0c;而SSL证书正是为此提供了有效的保障。SSL证书通过加密数据传输&#xff0c;防止数据被中间人恶意窃取或篡改&#xff0c;为用户和应用提供了更安全的通信环境。 针对小程序域名的SSL证书&#xff0c;通常…

【HTML5】第1章 HTML5入门

学习目标 了解网页基本概念&#xff0c;能够说出网页的构成以及网页相关名词的含义 熟悉Web标准&#xff0c;能够归纳Web标准的构成。 了解浏览器&#xff0c;能够说出各主流浏览器的特点。 了解HTML5技术&#xff0c;能够知道HTML5发展历程、优势以及浏览器对HTML5的支持情…

PINNs解麦克斯韦方程

1 问题介绍 麦克斯韦方程控制着光的传播及其与物质的相互作用。因此&#xff0c;利用计算电磁学模拟求解麦克斯韦方程对理解光与物质相互作用和设计光学元件起着至关重要的作用。对于线性、非磁性、各向同性材料没有电、磁电流密度的方程通常可以写成如下形式&#xff1a; 2 物…

C# WPF上位机开发(Web API联调)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多时候&#xff0c;客户需要开发的不仅仅是一个上位机系统&#xff0c;它还有其他很多配套的系统或设备&#xff0c;比如物流小车、立库、数字孪…

【toolschain】关于anaconda安装包时候 系统级全局安装还是安装在虚拟环境里的问题总结

关于安装方式决定所被安装环境的问题 借机会研究了一下 关于处在anaconda虚拟环境下的 安装方式的不同 安装路径不同的问题&#xff0c;并总结如下原则&#xff1a; conda 无法管理或者conda库查不到的&#xff0c;自然只能通过其他方式安装&#xff0c;那么路径就不在虚拟环…

CentOS安装Maven教程-shell脚本一键安装配置

文章目录 前言一、Maven安装教程1. 确认系统环境2. 下载和解压Maven3. 配置环境变量4. 验证安装5. 设置镜像站 二、Maven安装教程&#xff08;使用shell脚本一键安装配置&#xff09;1. 复制脚本2. 增加执行权限3. 执行脚本4. 加载用户环境变量 总结 前言 本教程将介绍如何在C…

基于ssm的程序设计实践项目管理系统+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本实践项目管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…