sparksql执行流程

news2025/1/18 17:09:53

1. SparkSQL的自动优化

我们前面的文章已经说过spark RDD定义好后,执行经过DAG sechduler划分号内存管道、逻辑任务,然后经由task scheduler来分配到具体worker来管理运行,RDD的运行会完全按照开发者的代码执行
如果开发者水平有限,RDD的执行效率也会受到影响。
而SparkSQL会对写完的代码,执行自动优化”,以提升代码运行效率,避免开发者水平影响到代码执行效率。之所以RDD的的执行没法被优化,市因为RDD内含数据类型不限格式和结构,而DataFrame100%是二维表结构,可以被针对,SparkSQL的自动优化依赖于Catalyst优化器,它最终也是被优化成RDD来执行。

2. Catalyst优化器

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

  1. APl层简单的说就是Spark会通过一些AP接受SQL语句
  2. 收到SQL语句以后,将其交给Catalyst,Catalyst负责解析SQL,生成执行计划等
  3. Catalyst的输出应该是RDD的执行计划
  4. 最终交由集群运行

详细的流程如下:
在这里插入图片描述

  • 第一步解析sql语句为抽象语法树
    在这里插入图片描述

catalyst第一步会将sql语句解析成抽象语法树,上面的语法树是从下往上看的

  • 第二步会给抽象语法树加上一些元数据信息方便spark去调用和优化相关信息
    在这里插入图片描述
  • 第三步做优化在这里插入图片描述

优化操作主要分两步:
(1)断言下推Predicate Pushdown
这一步会将将Filter或一些判断过滤类的可以减小数据集的操作下推,放在Scan的位置,这样可以减少操作时候的数据量。

SELECT sum(v) 
FROM(
    SELECT
        score.id
        100 + 80 + score.math_score AS v
    FROM people 
    JOIN score WHERE people.id = score.id AND people.age > 10
)omp

如这个代码,正常流程是先JOIN然后做WHERE
断言下推后,会先过滤age,然后在JOIN,减少JOIN的数据量提高性能.
(2) 列值裁剪Column Pruning,在断言下推后执行裁剪,由于people表之上的操作只用到了id列,所以可以把其它列裁剪掉,这样可以
减少处理的数据量,从而优化处理速度,列值裁剪很适合parquet这种列值存储数据

  • 第四步
    上面的过程生成的AST其实最终还没办法直接运行,这个AST叫做逻辑计划,结束后,需要生成物理计划,从而生成RDD来运行,在生成物理计划的时候,会经过成本模型对整棵树再次执行优化,选择一个更好的计划,在生成物理计划以后,因为考虑到性能,所以会使用代码生成,在机器中运行,可以使用queryExecution方法查看逻辑执行计划使用explain方法查看物理执行计划
    在这里插入图片描述

3. sparksql执行流程总结

  1. 提交SparkSQL代码
  2. catalyst优化
    a.生成原始AST语法数
    b.标记AST元数据
    c.进行断言下推和列值裁剪以及其它方面的优化作用在AST上
    d.将最终AST得到,生成执行计划
    e.将执行计划翻译为RDD代码
  3. Driver执行环境入口构建(SparkSession)
  4. DAG调度器规划逻辑任务
  5. TASK调度区分配逻辑任务到具体Executor_上工作并监控管理任务
  6. Worker干活.

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

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

相关文章

Transformers in Vision:A Survey 阅读笔记

ACM上的一篇综述,讨论Transformer在CV上的应用。 摘要: Among their salient benefits,Transformers enable modeling long dependencies between inputsequence elements and support parallel processing of sequence as compared to recurrent networ…

MFC通用静态库制作与使用

开发环境VS2013 1、新建工程,选择Win32 Project,命名,选择路径等 2、选择Static library ,勾选MFC 3、点击完成。在工程中添加相应的头文件、源文件等通用功能函数或者类。 4、在其他工程引入使用。在使用的工程项目设置中Linker…

C语言-----数据在内存中的存储(1)

1.整数在内存中的存储 我们之前就了解过整数的二进制写法分别有3种,分别为原码,反码,补码。整型在内存中存储的是补码。 原码,反码,补码都有自己的符号位和数值位,符号位为1时,则表示负数&…

AI绘画:使用Stable Diffusion ComfyUI进行换脸:IPAdapter FaceID全面教程

在数字艺术和媒体编辑领域,换脸技术已经成为一种流行且强大的工具。它允许创作者将一个人物的面部特征无缝地转移到另一个人物上,创造出令人信服的视觉作品。Stable Diffusion ComfyUI提供了一个高效的平台,让用户能够轻松地实现换脸。本文将…

python和pip中常见命令和方法

玩python的同学想必没有不用pip的吧,pip是python包管理工具,和Nodejs的npm、Java的maven类似,这些依靠开源力量建立起的庞大软件库极大提高了开发的效率,下面是整理和总结pip中的常见命令和方法。 pip更新版本 python -m pip inst…

图像分割-综述篇

文章目录 图像分割算法类型全卷积FCNSegNetUNetDeeplab v1PSPNetDeeplab v2Deeplab v3Deeplab v3 基于候选区Mask RCNNMS RNN 基于GAN基于RNNReSegViTSwin TransformerSAM(Segment Anything Model) 图像分割算法类型 正如我在目标检测系列中提到的,图像分割&#x…

flutter官方案例context_menus【搭建与效果查看】【省时】

案例地址 https://github.com/flutter/samples/tree/main/context_menus 1:运行查看有什么可以快捷使用的,更新了些什么,可不可以直接复制粘贴 主要内容:在web端中模拟手机类型的点击长按操作,不能直接运行在安卓与io…

代码随想录Day27:回溯算法Part3

Leetcode 39. 组合总和 讲解前: 这道题其实在掌握了之前的组合问题之后再看并不是那么难,其关键就在于我们这道题中没有一个特定需要的组合大小,并且列表中的元素是可以重复使用的,那么比如说给的例子中的 输入: candidates [2…

使用Python获取红某书笔记详情并批量无水印下载

根据红某手最新版 请求接口必须要携带x-s x-s-c x-t,而调用官方接口又必须携带cookie,缺一不可,获取笔记详情可以通过爬取网页的形式获取,虽然也是无水印,但是一些详情信息只能获取大概,并不是详细的数值,因此既不想自己破解x-s x…

【chrome扩展】简 Tab (SimpTab)‘每日一句名言’样式

背景:最初参考“每日诗词”发现总是那几句,可以更换API接口完成“每日一句名言” 声明:本人不会ajax及ccs样式,非专业人士,借助CHATGPT代码生成完成。请友善交流。 每一句名言API: "https://api.xygeng.cn/open…

【MATLAB第102期】基于MATLAB的BRT增强回归树多输入单输出回归预测模型

【MATLAB第102期】基于MATLAB的BRT增强回归树多输入单输出回归预测模型 BRT,即Boosted Regression Trees(增强回归树),是一种用于回归问题的集成学习方法。它结合了多个决策树模型,通过逐步改进的方式来提高整体模型的…

【保姆级介绍Oracle】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

开放威胁情报社区

AlienVault - Open Threat ExchangeLearn about the latest cyber threats. Research, collaborate, and share threat intelligence in real time. Protect yourself and the community against todays emerging threats.https://otx.alienvault.com/

Kotlin:for循环的几种示例

一、 打印 0 到 2 1.1 方式一:0 until 3 /*** 打印 0 到 2*/ fun print0To2M1(){for (inex in 0 until 3){// 不包含3print("$inex ")} }运行结果 1.2 方式二:inex in 0 …2 /*** 打印 0 到 2*/ fun print0To2M2(){for (inex in 0 ..2){//…

哈哈哈哈哈

欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 222 我们对Markdown编辑器进行了一些功能拓展与语法支持,…

【Linux】详解动态库链接和加载对可执行程序底层的理解

一、动静态库链接的几种情况 如果我们同时提供动态库和静态库,gcc默认使用的是动态库。如果我们非要使用静态库,要加-static选项。如果我们只提供静态库,那可执行程序没办法,只能对该库进行静态链接,但程序不一定整体…

Ds18B20理解与运用

在51单片机中,DS18B20是一个十分重要的外设,它是一个温度传感器,可以读取温度并以16位的数据输出。这个数据由四位符号位,7位整数位和4位小数位组成。当符号位都是0的时候,温度是零上温度;当符号位都是1的时…

基于隐私保护的可追踪可撤销密文策略属性加密方案论文阅读

论文是2022年发表的A Traceable and Revocable Ciphertext-Policy Attribute-based Encryption Scheme Based on Privacy Protection 摘要 本篇论文提出了一种具有用户撤销、白盒追踪、策略策略隐藏功能的CP-ABE方案。在该方案中密文被分为两个部分:第一个部分是和…

ros小问题之rosdep update time out问题

在另外一篇ROS 2边学边练系列的文章里有写碰到这种问题的解决方法(主要参考了其他博主的文章,只是针对ROS 2做了些修改调整),此处单拎出来方便查找。 在ROS 2中执行rosdep update时,报出如下错误: 其实原因…

296个地级市GDP相关数据集(2000-2023年)

01、数据简介 GDP,即国内生产总值(Gross Domestic Product),是指一个国家或地区所有常住单位在一定时期内生产活动的最终成果。 名义GDP,也称货币GDP,是指以生产物品和劳务的当年销售价格计算的全部最终产…