Spark Catalyst

news2024/11/15 10:58:40

Spark Catalyst

  • 逻辑计划
    • 逻辑计划解析
    • 逻辑计划优化
    • Catalyst 规则优化过程
  • 物理计划
    • Spark Plan
      • JoinSelection
    • 生成 Physical Plan
      • EnsureRequirements

Spark SQL 端到端的优化流程:

  • Catalyst 优化器 : 包含逻辑优化/物理优化
  • Tungsten :

Spark SQL的优化过程 :

在这里插入图片描述

逻辑计划

val userFile: String = _
val usersDf = spark.read.parquet(userFile)

val txFile: String = _
val txDf = spark.read.parquet(txFile)

val users = usersDf
  .select("name", "age", "userId")
  .filter($"age" < 30)
  .filter($"gender".isin("M"))

val result = txDF.select("price", "volume", "userId")
  .join(users, Seq("userId"), "inner")
  .groupBy(col("name"), col("age"))
  .agg(sum(col("price") * col("volume")).alias("sum")

result.write.parquet("_")

计算逻辑 :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EkAXwKmc-1678098435847)(../../png/Catalyst/image-20230213212938895.png)]

Catalyst 逻辑优化阶段:

  • 逻辑计划解析 : 把 Unresolved Logical Plan 换为 Analyzed Logical Plan
  • 逻辑计划优化 : 基于启发式规则(Heuristics Based Rules) ,把 Analyzed Logical Plan 转为 Optimized Logical Plan

Catalyst 逻辑优化阶段

在这里插入图片描述

Unresolved Logical Plan :

在这里插入图片描述

逻辑计划解析

逻辑计划解析 : 结合 DataFrame 的 Schema ,确认计划中的表名、字段名、字段类型和实际数据是否一致。确认后,就生成 Analyzed Logical Plan

Analyzed Logical Plan :

在这里插入图片描述

逻辑计划优化

同种计算逻辑的多种实现方式 :

  • 按照不同的顺序对算子做排列组合
  • 最好顺序:能省则省、能拖则拖的开发原则,选择所有实现方式中最优

在这里插入图片描述

Catalyst 优化规则范畴 :

  • 谓词下推(Predicate Pushdown):把谓词 (过滤条件 age < 30) 推到离数据源最近
  • 列剪裁(Column Pruning): 只扫描与查询相关的字段
  • 常量替换 (Constant Folding): 如 :age <12 + 18 优化成 age < 30

Cache Manager 优化 :

  • Cache Manager :维护与缓存相关信息。即:维护 Mapping 映射字典,Key :逻辑计划,Value :对应的 Cache 元信息
  • 当 Catalyst 进行逻辑计划优化时,先在 Cache Manager 查找,当该逻辑计划分支在 Cache Manager 时,就进行替换该计划

Optimized Logical Plan :

在这里插入图片描述

Catalyst 规则优化过程

逻辑计划(Logical Plan),物理计划(Physical Plan)都继承 QueryPlan

QueryPlan 父类: TreeNode

  • TreeNode :语法树中对节点的抽象
  • TreeNode 有个字段 children ,类型是 Seq[TreeNode]
  • 利用 TreeNode 类型,能构建出树结构

TreeNode 定义了很多高阶函数,如:transformDown

  • transformDown 的形参: 各种优化规则,返回类型是 TreeNode
  • transformDown 是递归函数,先优化当前节点,再依次优化 children 中的子节点,直到整棵树的叶子节点

transformDown 类似转换过程:

//Expression的转换
import org.apache.spark.sql.catalyst.expressions._

val myExpr: Expression = 
	Multiply(Subtract(Literal(6), Literal(4)), 
           Subtract(Literal(1), Literal(9)))

val transformed: Expression = myExpr transformDown {
  // 二元操作符,转成加法操作
  case BinaryOperator(l, r) => Add(l, r)
  // 大于 5 ,转成 1
  case IntegerLiteral(i) if i > 5 => Literal(1)
  // 小于 5 ,转成转成 0
  case IntegerLiteral(i) if i < 5 => Literal(0)
}

转换过程意图:

在这里插入图片描述

物理计划

物理计划阶段(Physical Planning) :

  • 优化 Spark Plan :根据优化策略 (Strategies),把逻辑计划的关系操作符映射成物理操作符
  • 生成 Physical Plan :根据 Preparation Rules,对 Spark Plan 进行完善

在这里插入图片描述

Spark Plan

Spark Plan 优化策略 :

  • 基于模式匹配的偏函数(Partial Functions),把逻辑计划中的操作符平行映射为 Spark Plan 中的物理算子
类型优化策略含义&作用
通用BasicOperators逻辑到物理的基本映射:如Project/Filter/Sort
JoinSelection静态 Joln 策略选择
InMemoryScans缓存策略,对应逻辑优化阶段的 Cache Manager
Aggregation聚合策路
Window窗口计算策酪
SpecialLimits与 Limit 相关的优化策路
PythonEvalsPython UDF 优化策路
SparkScriptsTransformation 脚本优化策略
StreamingStatefulAggregationStrategy有状态的聚合策略
StreamingDeduplicationStrategy流处理中的去重策路
StreamingGlobalLimitStrategy流处理中的 Limit 处理策略
StreamingJoinStrategy流处理中的 Join 策略
StreamingRelationStrategy数据源读取策酪
FlatMapGroupsWithStateStrategy流处理中的 FlatMap 优化

JoinSelection

Catalyst 运行时的 Join 策略:

Join 策略执行效率排序含义
Broadcast Hash Join (BHJ)最优小表构建哈希表,把小表广播进行关联
Shuffle Sort Merge Join (SMJ)次优先 Shuffle , 再排序进行关联
Shuffle Hash Join (SHJ)次优先 Shuffle , 再构建哈希表进行关联
Broadcast Nested Loop Join (BNLJ)最差将小表广播进行关联
Shuffle Cartesian Product Join (CPJ)最差先 Shuffle 进行关联

数据分发与 Join 实现机制的组合 :

在这里插入图片描述

Join 策略的先决条件 :

  • 条件型 : 判决 5 大 Join 策略的先决条件
  • 指令型:开发者提供的 Join Hints

5 种 Join 策略的先决条件:

选择顺序Join 策略Join 类型表大小
等值 JoinInner Join不能 Full Outer Join能广播
1BHJ
2SMJ
3SHJ
4BNLJ
5CPJ

指令型信息: Join Hints,允许个人选择 Join 策略

  • 选择 SHJ :
val result = txDF.select("price", "volume", "userId")
  .join(users.hint("shuffle_hash"), Seq("userId"), "inner")
  .groupBy(col("name"), col("age"))
	.agg(sum(col("price") * col("volume")).alias("revenue"))

Spark Plan :Join 策略是 SMJ

在这里插入图片描述

生成 Physical Plan

从 Spark Plan 到 Physical Plan 的转换,需要 Preparation Rules 规则

Preparation Rules :

Preparation Rules含义作用
EnsureRequirements确保每个操作符的输入要求,必要时添加 Shuffle/Sort为 Physical Plan 补充必要的操作,保证 Spark Plan 计划的每个步骤能够顺利执行
CollapseCodegenStagesTungsten 优化机制:全阶段代码生成(Whole Stage Code Generation)在同个 Stage 内部,尽可能地把所有操作和计算捏合成一个函数,提升计算效率
ReuseExchange内存或磁盘中的存储复用同样的执行计划能共享广播变量或 Shuffle 的中间结果,避免重复的 Shuffle 操作
ReuseSubquery子查询复用复用同样的查询结果,避免重复计算
PlanSubquery生成子查询对子查询应用 Preparation Rules
ExtractPythonUDFs提取 Python 的 UDF 函数把 Python UDF 分发到单独的 Python 进程

EnsureRequirements

EnsureRequirements (满足前提条件) : 对执行计划中的每个操作符节点,都有 4 个属性用来描述数据输入/ 输出的分布状态

操作符属性含义
outputPartitioning输出数据的分区规则
outputOrdering输出数据的排序规则
requireChildDistribution要求输入数据满足某种分区规则
requireChildOrdering要求输入数据满足某种排序规则

Project 不满足 SortMergeJoin 的 Requirements:

  • outputPartitioning 属性 :Unknow,未 Shuffle
  • outputOrdering 属性: None ,未排序

在这里插入图片描述

EnsureRequirements 规则添加 Exchange/Sort :

  • Exchange : Shuffle 操作,满足 SortMergeJoin 对数据分布的要求
  • Sort :排序,满足 SortMergeJoin 对数据有序的要求
  • 调用 Physical Plan 的 doExecute 方法,把结构化查询的计算结果,转换成
    RDD[InternalRow]
  • InternalRow :Tungsten 设计的定制化二进制数据结构
  • 调用 RDD[InternalRow] 上的 Action 算子,Spark 就触发 Physical Plan 执行

在这里插入图片描述

Physical Plan :

  • EnsureRequirements 在两个分支上添加 Exchange/Sort
  • *(数字) : * : WSCG,数字 : Stage 编号
  • 数字相同会 WSCG 合成

在这里插入图片描述

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

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

相关文章

什么是以太网供电POE

POE指的是以太网供电&#xff0c;就是一根网线在传输网络的同时还传输设备所需的电源。我们最常见的就是通过POE交换机连接网络摄像头&#xff0c;网络摄像头无需的电源适配器&#xff0c;仅靠一根网线就能实现电源和网络的传输。POE供电一般可以到100米。POE包含两个部分&…

shp文件导入到mysql

一、下载GDAL 官网&#xff1a;https://gdal.org/ 进入它&#xff0c;选个最新的win64位。GISInternals Support SiteGISInternals Support Sitehttps://www.gisinternals.com/release.php 进去选择如图所示的包下载即可 下载后解压即可&#xff0c;无需安装。 测试运行ogr2…

ChatGPT  一本正经的胡说八道 那也看看原理吧

最近&#xff0c;ChatGPT横空出世。这款被马斯克形容为“强大到危险”的AI&#xff0c;不但能够与人聊天互动&#xff0c;还能写文章、改代码。于是&#xff0c;人们纷纷想让AI替自己做些什么&#xff0c;有人通过两分钟的提问便得到了一篇完美的论文&#xff0c;有人希望它能帮…

js中的回调地狱

之前遇见过一个面试题&#xff1a;面试官问我&#xff1a;’有个需求&#xff0c;它需要你调完一个接口后拿这个接口的响应数据去请求一个新的接口&#xff0c;并源源不断得去请求下一个新的接口&#xff0c;那么请问如何解决‘&#xff0c;这个问题就是典型的回调地狱问题首先…

认识Spring(下)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Spring框架 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 Spring更加高效的读取和存储对象 存储bean对象 五大注解 关于五大类注解 对象的注入 属性注入 构造方法注入 Setter注入 三种注入方式的…

golang的垃圾回收详解

golang的垃圾回收详解 一、三色标记法 作为一门现代化的语言&#xff0c;golang与java一样&#xff0c;都在语言中内置了垃圾回收的功能&#xff0c;不需要程序员自己去回收堆内存。而垃圾回收中&#xff0c;最重要的两个部分就是垃圾检测算法以及垃圾回收算法。垃圾检测算法决…

《c++ primer笔记》第八章 IO库

前言 简单看一下就行 文章目录一、IO类1.1基本概念1.2管理输出缓冲二、文件输入输出2.1文件模式三、string流3.1istringstream3.2ostringstream一、IO类 1.1基本概念 ​ 我们常见的流有istream和ostream&#xff0c;这两个流都是有关输入和输出的&#xff0c;此外&#xff0c…

如何在SSMS中生成和保存估计或实际执行计划

在引擎数据库执行查询时执行的过程的步骤由称为查询计划的一组指令描述。​查询计划在SQL Server中也称为SQL Server执行计划,我们可以通过以下步骤来生成和保存估计或实际执行计划。 估计执行计划和实际执行计划是两种执行计划: 实际执行计划:当执行查询时,实际执行计划出…

Spring之实例化Bean(2)

Spring是非常复杂的一个框架&#xff0c;想要一篇博客就说完实例化Bean的全流程&#xff0c;那将注定会是是很长很长的篇博客&#xff0c;说实话&#xff0c;换做我自己是没有耐心看完的。 本章&#xff0c;我将会以一个最简单的例子来阐述Spring实例化Bean的过程&#xff0c;…

8.SpringSecurity中的核心过滤器-CsrfFilter

SpringSecurity中的核心过滤器-CsrfFilter Spring Security除了认证授权外功能外&#xff0c;还提供了安全防护功能。本文我们来介绍下SpringSecurity中是如何阻止CSRF攻击的。 一、什么是CSRF攻击 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#…

uos 20 统信 fprintd 记录

uos 20 统信 fprintd 记录 sudo busctl deepin-authenticate.service /usr/lib/systemd/system/deepin-authenticate.service [Unit] DescriptionDeepin Authentication[Service] Typedbus BusNamecom.deepin.daemon.Authenticate ExecStart/usr/lib/deepin-authenticate/d…

Activty启动到显示的过程[二]

Activity的显示从handleResumeActivity()方法开始。 //ActivityThread.javaOverridepublic void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,String reason) {final ActivityClientRecord r performResumeActivity(token, finalStat…

LCD液晶段码驱动IC/LCD液晶驱动芯片VK2C22高抗干扰/抗噪,适用于汽车仪表/单相智能电表

产品型号&#xff1a;VK2C22A/B产品品牌&#xff1a;永嘉微电/VINKA封装形式&#xff1a;LQFP52/48、DICE(COB邦定片)、COG(邦定玻璃用)产品年份&#xff1a;新年份原厂&#xff0c;工程服务&#xff0c;技术支持&#xff01;VK2C22A/B概述&#xff1a;VK2C22是一个点阵式存储映…

自然语言处理-基于预训练模型的方法-chapter3基础工具集与常用数据集

文章目录3.1NLTK工具集3.1.1常用语料库和词典资源3.1.2常见自然语言处理工具集3.2LTP工具集3.3pytorch基础3.3.1张量基本概念3.3.2张量基本运算3.3.3自动微分3.3.4调整张量形状3.3.5广播机制3.3.6索引与切片3.3.7降维与升维3.4大规模预训练模型3.1NLTK工具集 3.1.1常用语料库和…

2023年3月软考高项(信息系统项目管理师)报名走起!!!

信息系统项目管理师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资…

图表控件LightningChart.NET 系列教程(十一):LightningChart 组件——添加至 Blend WPF 项目

LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源&#xff0c;实时监控数据流。同时&#xff0c;LightningChart使用突破性创新技术&#xff0c;以实时优化为前提&#xff0c;大大提升了实时渲染的效率和效果&…

网络编程 socket 编程(一)

1. C/S 架构 C/S 架构即客户端/服务端架构&#xff0c;B/S 架构&#xff08;浏览器与服务端&#xff09;也是 C/S 架构的一种。 C/S 架构与 socket 的关系&#xff1a;学习 socket 可以完成 C/S 架构的开发。 2. osi 七层 一个完整的计算机系统由硬件、操作系统以及应用软件…

Redis:主从同步

Redis&#xff1a;主从同步一. 概述二. 原理(1) 全量同步(2) 增量同步(3) 优化Redis主从集群三. 总结一. 概述 引入&#xff1a; Redis主从集群采用一个Master负责写&#xff0c;多个Slave负责读的方式&#xff08;读多写少&#xff09;&#xff0c;那么如何让读取数据时多个从…

访问学者进入美国哪些东西不能带?

随着疫情的稳定&#xff0c;各国签证的逐步放开&#xff0c;成功申请到国外访问学者、博士后如何顺利的进入国外&#xff0c;哪些东西不能带&#xff0c;下面就随知识人网小编一起看一看。一、畜禽肉类(Meats, Livestock and Poultry)不论是新鲜的、干燥的、罐头的、真空包装的…

pycharm激活虚拟环境时报错:无法加载文件activate.ps1,因为在此系统上禁止运行脚本,Windows10系统

问题&#xff1a; ii_env\Scripts\activate : 无法加载文件 F:\gitlab\AutoFrame\ii_env\Scripts\Activate.ps1&#xff0c;因为在此系统上禁止运行脚本。 有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在…