Spark SQL优化机制

news2024/9/20 16:46:12

Spark SQL优化机制

  • Spark SQL
  • Catalyst 优化器
    • 逻辑优化
    • 物理优化
  • Tungsten
    • Unsafe Row
    • WSCG

RDD 缺点 : RDD的算子都是高阶函数 ,Spark Core 不知函数内的操作,只能闭包形式发给 Executors, 无法优化

DataFrame 不同点:

  • 数据的表示形式 :有数据模式(Data Schema)的结构化数据
  • 开发算子 :一套 DSL算子(Domain Specific Language)

Spark 能用 DataFrame ,基于启发式的规则或策略,动态的运行时信息,去优化 DataFrame 的计算过程

Spark SQL

  • Spark Core :特指 Spark 底层执行引擎(Execution Engine),包括:调度系统、存储系统、内存管理、Shuffle 管理
  • Spark SQL :基于 Spark Core 上,有一层独立的优化引 (Optimization Engine)

Spark Core/Spark SQL关系:

  • Spark SQL 优化后的代码,交给 Spark Core 执行

在这里插入图片描述

Spark SQL 的两个核心组件:Catalyst 优化器 /Tungsten

  • Catalyst 优化器:负责创建并优化执行计划,有 3 个功能模块:创建语法树并生成执行计划、逻辑阶段优化、物理阶段优化
  • Tungsten :负责优化数据结果与可执行代码 ,衔接 Catalyst 执行计划与底层的 Spark Core 执行引擎

在这里插入图片描述

Catalyst 优化器

Catalyst 优化器的作用:在逻辑优化阶段,基于启发式的规则和策略调整、优化执行计划,为物理优化阶段提升性能奠定基础

逻辑优化

Catalyst 的优化过程 : 先用第三方的 SQL 解析器 ANTLR 生成抽象语法树(AST,AbstractSyntax Tree)

AST 的两个基本元素构成

  • 节点:各式各样的操作算子,如 : select、filter、agg
  • 边 : 记录了数据表的 Schema 信息 ,如 : 字段名、字段类型

AST 语法树/执行计划(Execution Plan ) :

在这里插入图片描述

Parquet 格式在文件层面支持两项特性 :

  • 谓词下推、列剪枝 :都是启发式的规则或策略
  • 谓词下推 (Predicates Pushdown) : batchNum >= 201601的过滤条件,在扫描过程时,只读取那些满足条件的数据文件
  • 列剪枝 (Columns Pruning):Parquet 是列存 (Columns Store) 数据结构,只取某个字段名的数据文件时,就会剪掉其他数据文件的过程

Spark 只扫描绿色部分 :

在这里插入图片描述

逻辑优化的执行计划 :

  • 执行顺序 : Scan > Filter > Select变成 Filter > Select > Scan

在这里插入图片描述

物理优化

Catalyst 的优化阶段差异:

  • 逻辑阶段 :依赖先验的启发式经验 , 基于经验优化
  • 物理阶段:依赖各式各样的统计信息,如:数据表尺寸、是否启用数据缓存、Shuffle 中间文件, 基于数据优化

Join 节点物理阶段优化:

  • 采用哪种实现机制实现关联:嵌套循环连接(NLJ,Nested Loop Join)、排序归并连接(Sort Merge Join)、哈希连接(Hash Join)
  • 采用哪种数据分发实现关联:Shuffle Join 和 Broadcast Join
  • 根据两张表的存储大小,决定采用 :运行稳定但性能略差的 Shuffle Sort Merge Join 或 执行性能更佳的 Broadcast Hash Join

Tungsten

基于Catalyst ,Tungsten 在数据结构/执行代码进行进一步的优化

  • 数据结构优化: Unsafe Row 的设计与实现
  • 执行代码优化:全阶段代码生成(WSCG,Whole Stage Code Generation)

Unsafe Row

Spark SQL 默认采用 org.apache.spark.sql.Row 对象对每条数据进行封装和存储,Java Object 会有大量的存储开销

Unsafe Row 是二进制数据结构,以字节数组的格式存储每条数据,能减少存储开销

采用默认的 Row存储:

  • 每条记录需要消耗至少 60 个字节

在这里插入图片描述

采用 Tungsten Unsafe Row 存储:

  • 每条数据记录仅需消耗十几个字节

在这里插入图片描述

WSCG

WSCG:全阶段代码生成

  • 全阶段:调度系统中的 Stage
  • 代码生成:运行时,把链式调用的算子合成一份代码。如:把 Filter、Select、Scan 合成一个函数

绿色节点属于同一个 Stage :

在这里插入图片描述

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

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

相关文章

AQS底层源码深度剖析-Lock锁

目录 AQS底层源码深度剖析-Lock锁 ReentrantLock底层原理 为什么把获取锁失败的线程加入到阻塞队列中,而不是采取其它方法? 总结:三大核心原理 CAS是啥? 代码模拟一个CAS: 公平锁与非公平锁 可重入锁的应用场景&…

C语言-基础了解-25-C强制类型转换

C强制类型转换 一、强制类型转换 强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为…

【深度学习】BERT变体—ALBERT

ALBERT的初衷是想解决BERT中参数量过多的问题,论文全称为:ALBERT: A Lite BERT for Self-supervised Learning of Language Representations。 相较于BERT,ALBERT模型减少BERT模型的参数量;预训练中的Next Sentence Prediction&a…

【面试系列】线程相关的面试题集锦

线程的状态 public enum State {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread state for a runnable thread. A thread in the runnable* state is executing in the Java virtual machine but it may* be waiting for other resources from …

最简单的线性回归模型-标量

首先考虑yyy为标量,www为标量的情况,那么我们的线性函数为ywxbywxbywxb。每批输入的量batch size 为111,每批输入的xxx为一个标量,设为x∗x^*x∗,标签yyy同样为一个标量,设为y∗y^*y∗。因此每批训练的损失…

直线模组的优势是什么?

直线模组是可以模拟人工操作的一些功能,通过固定程序来进行抓取,搬运、操作工具,实现自动变速,这也是为何直线模组使用率高的主要原因了,那么直线模组究竟有着怎样的优势呢? 1、整体结构紧凑,重…

k8s-Kubernetes集群部署

文章目录前言一、Kubernetes简介与架构1.Kubernetes简介2.kubernetes设计架构二、Kubernetes集群部署1.集群环境初始化2.所有节点安装kubeadm3.拉取集群所需镜像3.集群初始化4.安装flannel网络插件5.扩容节点6.设置kubectl命令补齐前言 一、Kubernetes简介与架构 1.Kubernetes…

Spark 磁盘作用

Spark 磁盘作用磁盘作用性能价值失败重试ReuseExchangeSpark 导航 磁盘作用 临时文件、中间文件、缓存数据,都会存储到 spark.local.dir 中 在 Shuffle Map 时, 当内存空间不足,就会溢出临时文件存储到磁盘上溢出的临时文件一起做归并计算…

Vue3---语法初探

目录 hello world 实现简易计时显示 反转字符串 显示隐藏 了解循环 了解双向绑定实现简易记事 设置鼠标悬停的文本 组件概念初探,进行组件代码拆分 hello world 最原始形态,找到 id 为 root 的标签,将 Vue 实例的模板放入标签之内 …

剑指 Offer 09. 用两个栈实现队列(java)

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入: [“CQu…

SpringBoot中一行代码解决字符串向枚举类型转换的问题

1. 场景 在WEB开发,客户端和服务端传输的数据中经常包含一些这样的字段:字段的值只包括几个固定的字符串。 这样的字段意味着我们需要在数据传输对象(Data Transfer Object, DTO)中对该字段进行校验以避免客户端传输的非法数据持…

Android Service知识

一. 概览 Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC…

你是真的“C”——为冒泡排序升级赋能!

你是真的“C”——为冒泡排序升级赋能!😎前言🙌冒泡排序升级赋能之境界一!冒泡排序升级赋能之境界二!qsort库函数的运用和认识总结撒花💞😎博客昵称:博客小梦 😊最喜欢的…

【CDP】更改solr 存储路径导致ranger-audit 大量报错问题解决

前言 我们生产上公司是使用的CDP集群,一次管理员通知,Solr 组件的数据存放路径磁盘空间不够。 我们的solr 组件时为 Ranger 服务提供日志审计功能, 在我们更改了磁盘路径,并重启了Solr 组件,然后发现相关组件&#…

基于Python的selenium

一、安装 1.1安装Python,安装Python时需要勾选增加环境变量 如果之前已经安装过Python,需要将Python相关文件以及环境变量删除 1.2安装成功:在命令行界面下输入Python,最终展示>>>即可成功 2.1安装pycharm,直接自定义安装…

论文阅读-(GLIP)Grounded Language-Image Pre-training (目标检测+定位)

Paper:Grounded Language-Image Pre-training Code:https://github.com/microsoft/GLIP 简介: 定位任务与图像检测任务非常类似,都是去图中找目标物体的位置,目标检测为给出一张图片找出bounding box,定位…

07react+echart,大屏代码开发

react框架引入第三方插件原链接gitHub:GitHub - hustcc/echarts-for-react: ⛳ Apache ECharts components for React wrapper. 一个简单的 Apache echarts 的 React 封装。import ReactECharts from echarts-for-react;import * as echarts from echarts;一、软件简介echarts-…

微机原理和计算机组成原理复习

1:冯诺依曼机器的主要特点? 1)计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成; 2)指令和数据存储在存储器中,并可以按地址访问; 3)指令和数据均以二进制表示&…

2023年软考中级信息安全工程师考什么?

信息安全工程师是属于软考中级科目,含金量很高的,信息安全工程师在社会上的需求是蛮大的。 信息安全工程师主要涉及计算机信息安全方面,在计算机软硬件、网络、应用相关领域从事安全系统设计、安全产品开发、产品集成、信息系统安全检测与审计…

小程序容器作为软件中间件技术不可忽视的价值

随着移动互联网的不断发展,越来越多的应用程序被广泛应用于各种行业和领域中。然而,不同的平台和设备之间的差异性和复杂性,给应用程序的开发和部署带来了很大的挑战。这时,小程序容器作为软件中间件技术的其中一环,成…