当前位置: 首页 > news >正文

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:为逻辑操作选择物理操作的执行方式。
    • 成本模型:基于代价估算,选择最佳的物理计划。例如:选择 SortMergeJoinBroadcastHashJoin
  • 代码位置
    • 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.RDDcompute 方法完成。
    • 调度部分由 DAGSchedulerTaskScheduler 完成。

总结执行流程示意图

  1. 解析阶段

    SELECT name FROM students WHERE age > 18;
    

  2. 初始逻辑计划

    LogicalPlan(Filter(age > 18), Project(name))
    

  3. 分析计划

    LogicalPlan(Filter(students.age > 18), Project(students.name))
    

  4. 优化计划

    Filter(age > 18) -> Project(name)
    ↓
    Pushed Filters -> Optimized LogicalPlan
    
  5. 物理计划

    Scan Students RDD -> Apply Filters -> Project Columns
    
  6. RDD 生成

    studentsRDD.filter(age > 18).map(name => name)
    

通过以上步骤,SparkSQL 实现了从用户查询到集群执行的全过程,并通过 Catalyst 提供了高度灵活的优化和扩展能力。

相关文章:

SparkSQL的执行过程:从源码角度解析逻辑计划、优化计划和物理计划

SparkSQL的执行过程可以分为以下几个阶段:从用户的SQL语句到最终生成的RDD执行,涵盖逻辑计划、优化计划和物理计划。以下是详细的源码角度解析: 1. 解析阶段(Parsing) SQL语句解析:Spark 使用 Catalyst 引…...

Leetcode打卡:新增道路查询后的最短距离II

执行结果&#xff1a;通过 题目&#xff1a;3244 新增道路查询后的最短距离II 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#xff08; 0 < i < n - 1&…...

Spring Web入门练习

加法计算器 约定前后端交互接⼝ 约定 "前后端交互接⼝" 是进⾏ Web 开发中的关键环节. 接⼝⼜叫 API&#xff08;Application Programming Interface), 我们⼀般讲到接⼝或者 API&#xff0c;指的都是同⼀个东西. 是指应⽤程序对外提供的服务的描述, ⽤于交换信息…...

计算机毕业设计 | SpringBoot+vue汽车资讯网站 汽车购买咨询管理系统(附源码+论文)

1&#xff0c;绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理汽车资讯网站的相关信息成为必然…...

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&#xff0c;可以先做检查连接&#xff1a;...

react 如何修改弹出的modal的标题

原来标题的样子&#xff1a; 修改为&#xff1a; 实现方式&#xff1a; <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#编程中&#xff0c;二维数组&#xff08;或矩阵&#xff09;是一种重要的数据结构&#xff0c;它不仅能够高效地存储和组织数据&#xff0c;还能通过其行、列和交叉点&#xff08;备注&#xff1a;此处相交处通常称为“元素”或“单元格”&#xff0c;代表二维数组中的一个…...

HTML5拖拽API学习 托拽排序和可托拽课程表

文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子&#x1f330; 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API&#xff0c;简化了拖放操作的实现。以下是拖拽API的基本使用指南&#xff1a; 拖拽…...

内容补充页(相关公式解释)

from 学习日记_20241117_聚类方法&#xff08;高斯混合模型&#xff09; 学习日记_20241117_聚类方法&#xff08;高斯混合模型&#xff09; 公式 P ( Z k ) π k P(Zk) \pi_k P(Zk)πk​ 在高斯混合模型 (GMM) 中&#xff0c;公式 P ( Z k ) π k P(Zk) \pi_k P(Zk…...

vue中动态渲染静态图片资源

不报错且f12查看元素的时候&#xff0c;显示的src说明已经渲染到html的src上&#xff0c;但是就是不显示在页面上 原因 在vue上&#xff0c;动态渲染静态图片资源&#xff08;比如从assets文件夹加载的图片&#xff09;需要注意打包工具对静态资源的解析方式 由于vue2的脚手…...

管伊佳ERP,原名华夏ERP,一个简约易上手的国产ERP系统

JSH_ERP&#xff08;管伊佳ERP&#xff09;是一款开源、模块化的企业资源计划系统&#xff0c;旨在为中小企业提供高效的管理工具。它基于SpringBoot框架和SaaS模式&#xff0c;支持进销存、财务、生产等业务模块&#xff0c;包括零售、采购、销售、仓库和报表管理。 核心特点…...

学习虚幻C++开发日志——委托(持续更新中)

委托 官方文档&#xff1a;Delegates and Lamba Functions in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 简单地说&#xff0c;委托就像是一个“函数指针”&#xff0c;但它更加安全和灵活。它允许程序在运行时动态地调用不…...

开窗函数 - first_value/last_value

1、开窗函数是什么&#xff1f; 开窗函数用于为行定义一个窗口&#xff08;这里的窗口是指运算将要操作的行的集合&#xff09;&#xff0c;它对一组值进行操作&#xff0c;不需要使用 GROUP BY 子句对数据进行分组&#xff0c;能够在同一行中同时返回基础行的列和聚合列。 2、…...

「一」HarmonyOS端云一体化概要

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…...

nodejs21: 快速构建自定义设计样式Tailwind CSS

Tailwind CSS 是一个功能强大的低级 CSS 框架&#xff0c;只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。 1. 安装 Tailwind CSS React 项目中安装 Tailwind CSS&#xff1a; 1.1 安装 Tailwind CSS 和相关依赖 安装 Tailwind CSS: npm…...

从JSON数据提取嵌套字段并转换为独立列的简洁方法

从JSON数据提取嵌套字段并转换为独立列的简洁方法 在数据处理和数据分析的日常工作中&#xff0c;我们经常遇到复杂的嵌套数据结构&#xff0c;特别是嵌入在JSON字段中的数据。这些数据往往需要解析并展开成独立的列&#xff0c;以便后续分析和建模。本文将详细介绍如何在Pyth…...

湘潭大学软件工程算法设计与分析考试复习笔记(四)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;一&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;二&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;三&#xff09; 前言 现在是晚上十一点&#xff0c;我平时是十…...

特征交叉-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&#xff0c;低秩矩阵的维度&#xff0c;应该小…...

stm32cubemx+VSCODE+GCC+makefile 开发环境搭建

title: stm32cubemxVSCODEGCCmakefile 开发环境搭建 tags: FreertosHalstm32cubeMx 文章目录 内容往期内容导航第一步准备环境vscode 插件插件配置点灯 内容 往期内容导航 第一步准备环境 STM32CubeMXVSCODEMinGWOpenOcdarm-none-eabi-gcc 然后把上面下载的软件 3 4 5 bin 文…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

VSCode 使用CMake 构建 Qt 5 窗口程序

首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...

Unity-ECS详解

今天我们来了解Unity最先进的技术——ECS架构&#xff08;EntityComponentSystem&#xff09;。 Unity官方下有源码&#xff0c;我们下载源码后来学习。 ECS 与OOP&#xff08;Object-Oriented Programming&#xff09;对应&#xff0c;ECS是一种完全不同的编程范式与数据架构…...

旋量理论:刚体运动的几何描述与机器人应用

旋量理论为描述刚体在三维空间中的运动提供了强大而优雅的数学框架。与传统的欧拉角或方向余弦矩阵相比&#xff0c;旋量理论通过螺旋运动的概念统一了旋转和平移&#xff0c;在机器人学、计算机图形学和多体动力学领域具有显著优势。这种描述不仅几何直观&#xff0c;而且计算…...