SparkSQL运行架构及原理

文章目录

      • SparkSQL运行架构及原理
          • 1.1. Catalyst优化器简介
          • 1.2. SparkSQL运行架构
          • 1.3. SparkSQL解析Core底层原理
          • 1.4. 执行计划查看

SparkSQL运行架构及原理

1.1. Catalyst优化器简介

SparkSQL使得我们开发人员可以使用DSL风格的数据来处理数据,甚至可以直接使用SQL风格的代码来处理数据。而无论是使用的DSL风格还是SQL风格,在底层的时候其实都是将SQL解析成为SparkCore的程序(RDD)提交到集群上去运行的。但是与直接编写SparkCore的程序不同:

  • 在SparkCore部分,我们使用到RDD作为编程模型,程序执行的时候会严格按照开发人员编写的代码逻辑来执行。如果代码的质量比较低的情况下,程序的执行效率也会受到影响。
  • SparkSQL程序则不同,SparkSQL会自动的将代码(DSL、SQL)进行优化,以提高代码的执行效率,最终将优化后生成的RDD的程序提交到Spark去执行。避免开发人员可能因为能力的不足而导致程序的执行效率低下。

在这里就有一个非常重要的组件存在了:Catalyst优化器,SparkSQL可以将代码自动优化,就是靠它来完成的!

SparkSQL的前身是Shark,最开始的时候底层代码优化、SQL的解析、执行引擎等等完全基于Hive,总是Shark的执行速度要比Hive高出一个数量级,但是Hive的发展制约了Shark。因此在15年中旬的时候,Shark的负责人将Shark项目结束掉,重新独立出来的一个项目,就是SparkSQL。SparkSQL使用了新的优化器替代Hive的优化器,这个新的优化器就是Catalyst。

1.2. SparkSQL运行架构

image-20230214230934595

  1. 开发人员开发SparkSQL程序,可以使用DSL风格或者SQL风格。
  2. 将程序提交给Catalyst,Catalyst会对SQL进行解析,生成执行计划。
  3. Catalyst最终将SparkSQL的程序进行解析、优化之后,生成的SparkCore的程序。
  4. 将最终的代码提交到Spark集群运行。
1.3. SparkSQL解析Core底层原理

SparkSQL对SQL语句的处理与关系型数据库类似,即**词法/语法解析、绑定、优化、执行。**SparkSQL会先将SQL语句解析成一棵树,然后使用规则对Tree进行绑定、优化等处理过程。

image-20230215105124345

  1. 使用SessionCatalog保存元数据

    在解析SQL语句之前,会创建SparkSession对象(在Spark2.0的版本之前是SQLContext对象),SparkContext只是封装了SparkContext和SQLContext的创建而已,并不会有元数据信息。元数据是保存在SessionCatalog中的,包括表名、字段名称、字段类型等。创建临时表或者视图的时候,其实也是向SessionCatalog注册的。

  2. 解析SQL,使用ANTLR生成未绑定的逻辑计划

    当调用SparkSession的SQL或者SparkContext的SQL方法的时候,就会使用SparkSQLParser进行SQL的解析,使用的是ANTLR进行词法解析和语法解析。它分为两个步骤来生成未解析的逻辑计划(Unresolved LogicalPlan)

    • 词法解析:Lexical Analysis,负责将Token分组成符号类
    • 构建一个分析书或者语法树AST
  3. 使用分析器Analyzer绑定逻辑计划

    在这个阶段,Analyzer会使用Analyzer Rules,并结合SessionCatalog,对未绑定的逻辑计划进行解析,生成已绑定的逻辑计划。

  4. 使用优化器Optimizer优化逻辑计划

    在这个阶段,优化器也是会定义一套Rules,利用这些Rule对逻辑计划和Expression进行迭代处理,从而使得树的节点进行合并和优化。

  5. 使用SparkPlanner生成物理计划

    SparkPlanner使用PlanningStrategies,对优化后的逻辑计划进行转换,生成可以执行的物理计划SparkPlan。

  6. 使用QueryExecution执行物理计划

    此时调用SparkPlan的execute方法,底层其实已经在触发Job了,然后返回RDD。

1.4. 执行计划查看
from pyspark.sql import SparkSessionwith SparkSession.builder.master("local[*]").appName("p").enableHiveSupport().getOrCreate() as spark:spark.sql("""select ename, dname from mydb.emp join mydb.dept on mydb.emp.deptno = mydb.dept.deptno where comm is not null """).explain(True)

image-20230215121918229

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

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

相关文章

大数据-254 离线数仓 - Airflow 任务调度 核心交易调度任务集成

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop&#xff0…

昇思25天学习打卡营第33天|共赴算力时代

文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台,就像是AI学习者和开发者的超级基地,这里不仅提供丰富的项目、模型和大模型体验,还有一大堆经典数据集任你挑。…

Docker 镜像加速和配置的分享 云服务器搭建beef-xss

前言 最近很多的docker镜像加速都鸡鸡了 找点资源是越来越不容易了 什么事docker 因为我是个业余的人 我简单的说 docker就是比如我们的软件商店的 下载 docker镜像(之前就是我们在服务器上搭建网站 和环境的很费力费时 之后就有了这个 镜像 :这…

浅谈怎样系统的准备前端面试

前言 创业梦碎,回归现实,7 月底毅然裸辞,苦战两个月,拿到了美团和字节跳动的 offer,这算是从业以来第一次真正意义的面试,遇到蛮多问题,比如一开始具体的面试过程我都不懂,基本一直是…

告别机器人味:如何让ChatGPT写出有灵魂的内容

目录 ChatGPT的一些AI味道小问题 1.提供编辑指南 2.提供样本 3.思维链大纲 4.融入自己的想法 5.去除重复增加多样性 6.删除废话 ChatGPT的一些AI味道小问题 大多数宝子们再使用ChatGPT进行写作时,发现我们的老朋友ChatGPT在各类写作上还有点“机器人味”太重…

【长城杯】Web题 hello_web 解题思路

查看源代码发现路径提示 访问…/tips.php显示无用页面,怀疑…/被过滤,采用…/./形式,看到phpinfo()页面 注意到disable_functions,禁用了很多函数 访问hackme.php,看到页面源码 发现eval函数,包含base64 解密获得php代…

Windows部署Docker及PostgreSQL数据库相关操作

一、Windows安装Docker 1.wsl安装 以管理员身份启动命令行,运行:wsl --install; 安装结束后,重启电脑,以管理员身份启动命令行,运行:wsl --install -d Ubuntu; 中间需要输入用户名…

HTML零基础入门教学

目录 一. HTML语言 二. HTML结构 三. HTML文件基本结构 四. 准备开发环境 五. 快速生成代码框架 六. HTML常见标签 6.1 注释标签 6.2 标题标签:h1-h6 6.3 段落标签:p 6.4 换行标签:br 6.5 格式化标签 6.6 图片标签&a…

Springboot应用开发:工具类整理

目录 一、编写目的 二、映射工具类 2.1 依赖 2.2 代码 三、日期格式 3.1 依赖 3.2 代码 四、加密 4.1 代码 五、Http请求 5.1 依赖 5.2 代码 六、金额 6.1 代码 七、二维码 7.1 依赖 7.2 代码 八、坐标转换 8.1 代码 九、树结构 9.1 代码 9.1.1 节点 9.1…

libaom 源码分析:熵编码模块介绍

AV1 熵编码原理介绍 关于AV1 熵编码原理介绍可以参考:AV1 编码标准熵编码技术概述libaom 熵编码相关源码介绍 函数流程图 核心函数介绍 av1_pack_bitstream 函数:该函数负责将编码后的数据打包成符合 AV1 标准的比特流格式;包括写入序列头 OBU 的函数 av1_write_obu_header…

一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器

大家好,今天给大家分享一个开源的自托管虚拟浏览器项目Neko,旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,提供…

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程,必须以管理员身份运行此实时调试器。是否调试该进程?

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程,必须以管理员身份运行此实时调试器。是否调试该进程? 目录一、前言二、具体原因三、解决方法 目录 报错截图 一、前言 进行应用程序开发时,需要对w3wp进行附加调试等场景&#xff…

Docker--Docker Registry(镜像仓库)

什么是Docker Registry? 镜像仓库(Docker Registry)是Docker生态系统中用于存储、管理和分发Docker镜像的关键组件。 镜像仓库主要负责存储Docker镜像,这些镜像包含了应用程序及其相关的依赖项和配置,是构建和运行Doc…

如何用细节提升用户体验?

前端给用户反馈是提升用户体验的重要部分,根据场景选择不同的方式可以有效地提升产品的易用性和用户满意度。以下是常见的方法: 1. 视觉反馈 用户执行了某些操作后,需要即时确认操作结果。例如:按钮点击、数据提交、页面加载等。…

flutter 使用dio 请求go语言后台数据接口展示瀑布流图片

添加依赖 dependencies:flutter:sdk: flutterdio: ^5.0.0 # 请检查最新版本flutter_staggered_grid_view: ^0.4.0 添加网络权限 <uses-permission android:name"android.permission.INTERNET" /> go后端代码 图片存放目录 // main.go package mainimport (&q…

感知机与逻辑回归的异同点

1. 共同点 (1) 应用场景 都用于二分类问题。都假设数据是线性可分或近似线性可分的。 (2) 决策边界 两者都通过寻找一个超平面来区分数据。决策函数是线性的&#xff0c;形式为&#xff1a; (3) 输入特征 都可以处理连续和离散特征。都可以通过添加非线性变换扩展到非线…

实操给桌面机器人加上超拟人音色

前面我们讲了怎么用CSK6大模型开发板做一个桌面机器人充当AI语音助理&#xff0c;近期上线超拟人方案&#xff0c;不仅大模型语音最快可以1秒内回复&#xff0c;还可以让我们的桌面机器人使用超拟人音色、具备声纹识别等能力&#xff0c;本文以csk6大模型开发板为例实操怎么把超…

docker(wsl)命令 帮助文档

WSL wsl使用教程 wsl -l -v 列出所有已安装的 Linux 发行版 wsl -t Ubuntu-22.04 --shutdown 关闭所有正在运行的WSL发行版。如果你只想关闭特定的发行版 wsl -d Ubuntu-22.04 登录到Ubuntu环境 wsl --list --running 查看正在wsl中运行的linux发行版 wsl --unregister (系统名…

CNN、RNN、LSTM和Transformer之间的区别和联系

文章目录 CNN、RNN、LSTM和Transformer之间的区别和联系前言CNN&#xff08;卷积神经网络&#xff09;RNN&#xff08;循环神经网络&#xff09;LSTM&#xff08;长短期记忆网络&#xff09;Transformer四者之间的联系与区别Yolo算法简介Yolo和CNN的关系YOLO各版本 CNN、RNN、L…

无人机航测VS传统测绘

无人机航测系统的优点 机动灵活&#xff0c;作业周期短&#xff1a; 无人机航测系统能够迅速响应测绘需求&#xff0c;不受地形和交通限制&#xff0c;可以灵活调整航线&#xff0c;作业周期短。 无人机体积小&#xff0c;噪音小&#xff0c;可以垂直起降、悬停、侧飞、倒飞…