SparkSQL的执行过程:从源码角度解析逻辑计划、优化计划和物理计划
SparkSQL的执行过程可以分为以下几个阶段:从用户的SQL语句到最终生成的RDD执行,涵盖逻辑计划、优化计划和物理计划。以下是详细的源码角度解析:
1. 解析阶段(Parsing)
- SQL语句解析:Spark 使用
Catalyst引擎将用户输入的 SQL 语句解析为 抽象语法树(AST, Abstract Syntax Tree)。 - 代码位置:
org.apache.spark.sql.catalyst.parser.SqlBase.g4定义了语法规则,SqlParser使用 ANTLR 工具解析 SQL。 - 输出结果:解析后的
LogicalPlan,表示 SQL 的初始逻辑计划。
2. 分析阶段(Analysis)
- 任务:通过元数据和表的 Schema 校验逻辑计划中的字段、函数等,并为计划补充缺失信息。
- 关键组件:
- Catalog:Spark 用 Catalog 管理表的元数据。
- Analyzer:负责逻辑计划的语义分析。
- 规则应用:
Analyzer通过一系列规则(rules)完成字段校验、类型推断。
- 代码位置:
org.apache.spark.sql.catalyst.analysis.Analyzer。
- 输出结果:生成一个经过校验和补全的逻辑计划,称为 Analyzed Logical Plan。
3. 逻辑优化阶段(Logical Optimization)
- 任务:对逻辑计划进行规则化优化,比如谓词下推、列剪裁、常量折叠等。
- 关键组件:
- Optimizer:基于规则的优化器,应用各种优化规则。
- 典型优化规则:
- 谓词下推:将
Filter操作下推到最靠近数据源的位置。 - 列剪裁:只保留查询所需的列。
- 常量折叠:将表达式中的常量计算提前。
- 谓词下推:将
- 代码位置:
org.apache.spark.sql.catalyst.optimizer.Optimizer。
- 输出结果:一个经过优化的逻辑计划,称为 Optimized Logical Plan。
4. 物理计划生成阶段(Physical Planning)
- 任务:将逻辑计划转化为物理计划,选择最优执行方案。
- 关键组件:
- Planner:为逻辑操作选择物理操作的执行方式。
- 成本模型:基于代价估算,选择最佳的物理计划。例如:选择
SortMergeJoin或BroadcastHashJoin。
- 代码位置:
org.apache.spark.sql.execution.SparkPlanner。org.apache.spark.sql.execution.strategy包含了具体的物理计划生成策略。
- 输出结果:多个候选的物理计划,最终选定一个最优计划作为 Physical Plan。
5. 代码生成阶段(Code Generation)
- 任务:对物理计划中的部分操作生成更高效的 Java 字节码(bytecode)。
- 关键组件:
- WholeStageCodegen:SparkSQL 中的重要优化,能将多个操作结合为单一代码片段以减少任务调度的开销。
- 代码位置:
org.apache.spark.sql.execution.WholeStageCodegenExec。
- 输出结果:带有代码生成(Codegen)信息的物理计划。
6. RDD生成阶段(Execution Preparation)
- 任务:将物理计划转化为低层次的 RDD 操作。
- 关键组件:
- 每个
Exec物理节点都会实现doExecute方法,负责生成对应的 RDD。 - 示例:
ScanExec节点生成数据源的 RDD,ProjectExec节点生成投影操作的 RDD。
- 每个
- 代码位置:
- 各种执行节点的实现位于
org.apache.spark.sql.execution包中。
- 各种执行节点的实现位于
- 输出结果:Spark 的执行引擎中直接运行的 RDD DAG。
7. 执行阶段(Execution)
- 任务:提交作业并执行 RDD 转换。
- 过程:
- DAG 构建:根据 RDD 依赖构建执行 DAG。
- 任务调度:通过
TaskScheduler提交任务到集群执行。
- 代码位置:
- RDD 转换由
org.apache.spark.rdd.RDD的compute方法完成。 - 调度部分由
DAGScheduler和TaskScheduler完成。
- RDD 转换由
总结执行流程示意图
-
解析阶段
SELECT name FROM students WHERE age > 18;↓
-
初始逻辑计划
LogicalPlan(Filter(age > 18), Project(name))↓
-
分析计划
LogicalPlan(Filter(students.age > 18), Project(students.name))↓
-
优化计划
Filter(age > 18) -> Project(name) ↓ Pushed Filters -> Optimized LogicalPlan -
物理计划
Scan Students RDD -> Apply Filters -> Project Columns -
RDD 生成
studentsRDD.filter(age > 18).map(name => name)
通过以上步骤,SparkSQL 实现了从用户查询到集群执行的全过程,并通过 Catalyst 提供了高度灵活的优化和扩展能力。
相关文章:
SparkSQL的执行过程:从源码角度解析逻辑计划、优化计划和物理计划
SparkSQL的执行过程可以分为以下几个阶段:从用户的SQL语句到最终生成的RDD执行,涵盖逻辑计划、优化计划和物理计划。以下是详细的源码角度解析: 1. 解析阶段(Parsing) SQL语句解析:Spark 使用 Catalyst 引…...
Leetcode打卡:新增道路查询后的最短距离II
执行结果:通过 题目:3244 新增道路查询后的最短距离II 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市,编号从 0 到 n - 1。初始时,每个城市 i 都有一条单向道路通往城市 i 1( 0 < i < n - 1&…...
Spring Web入门练习
加法计算器 约定前后端交互接⼝ 约定 "前后端交互接⼝" 是进⾏ Web 开发中的关键环节. 接⼝⼜叫 API(Application Programming Interface), 我们⼀般讲到接⼝或者 API,指的都是同⼀个东西. 是指应⽤程序对外提供的服务的描述, ⽤于交换信息…...
计算机毕业设计 | SpringBoot+vue汽车资讯网站 汽车购买咨询管理系统(附源码+论文)
1,绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理汽车资讯网站的相关信息成为必然…...
stm32下的ADC转换(江科协 HAL版)
十二. ADC采样 文章目录 十二. ADC采样12.1 ADC的采样原理12.2 STM32的采样基本过程1.引脚与GPIO端口的对应关系2.ADC规则组的四种转换模式(**)2.2 关于转换模式与配置之间的关系 12.3 ADC的时钟12.4 代码实现(ADC单通道 & ADC多通道)1. 单通道采样2. 多通道采样 19.ADC模数…...
解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件
勾选Auto-detect proxy setting并填入 https://plugins.jetbrains.com 代理URL,可以先做检查连接:...
react 如何修改弹出的modal的标题
原来标题的样子: 修改为: 实现方式: <Modal title<span>股价趋势/{this.state.pccode}</span> visible{this.state.isPriceModalOpen} style{{ top: 20 }} width{1320} height{400} footer{null} onCancel{()>this.hideMo…...
C#中的二维数组的应用:探索物理含义与数据结构的奇妙融合
在C#编程中,二维数组(或矩阵)是一种重要的数据结构,它不仅能够高效地存储和组织数据,还能通过其行、列和交叉点(备注:此处相交处通常称为“元素”或“单元格”,代表二维数组中的一个…...
HTML5拖拽API学习 托拽排序和可托拽课程表
文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子🌰 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API,简化了拖放操作的实现。以下是拖拽API的基本使用指南: 拖拽…...
内容补充页(相关公式解释)
from 学习日记_20241117_聚类方法(高斯混合模型) 学习日记_20241117_聚类方法(高斯混合模型) 公式 P ( Z k ) π k P(Zk) \pi_k P(Zk)πk 在高斯混合模型 (GMM) 中,公式 P ( Z k ) π k P(Zk) \pi_k P(Zk…...
vue中动态渲染静态图片资源
不报错且f12查看元素的时候,显示的src说明已经渲染到html的src上,但是就是不显示在页面上 原因 在vue上,动态渲染静态图片资源(比如从assets文件夹加载的图片)需要注意打包工具对静态资源的解析方式 由于vue2的脚手…...
管伊佳ERP,原名华夏ERP,一个简约易上手的国产ERP系统
JSH_ERP(管伊佳ERP)是一款开源、模块化的企业资源计划系统,旨在为中小企业提供高效的管理工具。它基于SpringBoot框架和SaaS模式,支持进销存、财务、生产等业务模块,包括零售、采购、销售、仓库和报表管理。 核心特点…...
学习虚幻C++开发日志——委托(持续更新中)
委托 官方文档:Delegates and Lamba Functions in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 简单地说,委托就像是一个“函数指针”,但它更加安全和灵活。它允许程序在运行时动态地调用不…...
开窗函数 - first_value/last_value
1、开窗函数是什么? 开窗函数用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用 GROUP BY 子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。 2、…...
「一」HarmonyOS端云一体化概要
关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…...
nodejs21: 快速构建自定义设计样式Tailwind CSS
Tailwind CSS 是一个功能强大的低级 CSS 框架,只需书写 HTML 代码,无需书写 CSS,即可快速构建美观的网站。 1. 安装 Tailwind CSS React 项目中安装 Tailwind CSS: 1.1 安装 Tailwind CSS 和相关依赖 安装 Tailwind CSS: npm…...
从JSON数据提取嵌套字段并转换为独立列的简洁方法
从JSON数据提取嵌套字段并转换为独立列的简洁方法 在数据处理和数据分析的日常工作中,我们经常遇到复杂的嵌套数据结构,特别是嵌入在JSON字段中的数据。这些数据往往需要解析并展开成独立的列,以便后续分析和建模。本文将详细介绍如何在Pyth…...
湘潭大学软件工程算法设计与分析考试复习笔记(四)
回顾 湘潭大学软件工程算法设计与分析考试复习笔记(一)湘潭大学软件工程算法设计与分析考试复习笔记(二)湘潭大学软件工程算法设计与分析考试复习笔记(三) 前言 现在是晚上十一点,我平时是十…...
特征交叉-DeepCross Network学习
一 tensorflow官方实现 tensorflow的官方实现已经是V2版本 class Cross(tf.keras.layers.Layer):"""Cross Layer in Deep & Cross Network to learn explicit feature interactions.Args:projection_dim: int,低秩矩阵的维度,应该小…...
stm32cubemx+VSCODE+GCC+makefile 开发环境搭建
title: stm32cubemxVSCODEGCCmakefile 开发环境搭建 tags: FreertosHalstm32cubeMx 文章目录 内容往期内容导航第一步准备环境vscode 插件插件配置点灯 内容 往期内容导航 第一步准备环境 STM32CubeMXVSCODEMinGWOpenOcdarm-none-eabi-gcc 然后把上面下载的软件 3 4 5 bin 文…...
如何用OpCore Simplify解决黑苹果配置难题?——智能化EFI构建工具的革新性突破
如何用OpCore Simplify解决黑苹果配置难题?——智能化EFI构建工具的革新性突破 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 问题场景&a…...
MaaYuan:实现游戏任务自动化的智能引擎解决方案
MaaYuan:实现游戏任务自动化的智能引擎解决方案 【免费下载链接】MaaYuan 代号鸢 / 如鸢 一键长草小助手 项目地址: https://gitcode.com/gh_mirrors/ma/MaaYuan MaaYuan作为基于MaaFramework开发的游戏自动化引擎,通过图像识别与智能任务调度技术…...
分人群AI建站工具解决方案:中小企、创业者、外贸人、创作者怎么选?
分人群AI建站工具解决方案:中小企、创业者、外贸人、创作者怎么选?同样是找“AI建站工具”,一个个体摄影师和一个初创公司老板,心里的需求清单可能完全不同。这篇内容我们就来对不同人群,分别给出适合的建站思路和工具…...
GEMMA-3像素站保姆级教程:一键部署,体验90年代复古AI界面
GEMMA-3像素站保姆级教程:一键部署,体验90年代复古AI界面 1. 前言:像素与AI的奇妙碰撞 想象一下,当你童年的红白机游戏界面遇上了最前沿的多模态AI技术,会擦出怎样的火花?GEMMA-3像素站正是这样一个充满创…...
高性能Web字体智能优化解决方案:Fontmin实现90%字体文件体积压缩
高性能Web字体智能优化解决方案:Fontmin实现90%字体文件体积压缩 【免费下载链接】fontmin Minify font seamlessly 项目地址: https://gitcode.com/gh_mirrors/fo/fontmin Fontmin是一款基于Node.js的智能字符子集化Web字体优化工具,通过精准提取…...
seo优化员如何提高网站的流量
SEO优化员如何提高网站的流量 在当今竞争激烈的互联网环境中,网站的流量直接关系到企业的业务拓展和品牌影响力。对于SEO优化员来说,如何有效提高网站的流量是一个必须面对和解决的问题。本文将从问题分析、原因说明、解决方法、注意事项和实用建议几个…...
利用快马平台快速生成vmware虚拟机安装教程交互原型
最近在教朋友学习虚拟化技术时,发现很多新手在安装VMware虚拟机时容易卡在配置环节。为了降低学习门槛,我尝试用InsCode(快马)平台快速搭建了一个交互式教程原型,效果出乎意料地好。这里分享下实现思路和具体操作: 需求分析与原型…...
嵌入式开发知识管理:基于BERT文本分割的STM32项目文档整理
嵌入式开发知识管理:基于BERT文本分割的STM32项目文档整理 每次接手一个老旧的STM32项目,你是不是也感到头疼?打开工程文件夹,里面混杂着各种版本的代码、零散的调试日志、不同工程师留下的注释,还有一堆硬件连接说明…...
OpenClaw断点续跑:千问3.5-35B-A3B-FP8长任务中断恢复方案
OpenClaw断点续跑:千问3.5-35B-A3B-FP8长任务中断恢复方案 1. 当长任务遇上网络波动:我的深夜崩溃时刻 上周三凌晨2点,我正用OpenClaw对接千问3.5模型处理一批产品说明文档的自动化翻译任务。这个需要连续执行3小时的流程已经跑了80%&#…...
Snap.Hutao:原神玩家的智能桌面助手,让游戏管理变得简单高效
Snap.Hutao:原神玩家的智能桌面助手,让游戏管理变得简单高效 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Tre…...
