Spark性能调优指南来了!

1、什么是Spark

Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。
在这里插入图片描述

Spark Core:实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(Resilient Distributed DataSet,简称RDD)的 API 定义。
Spark SQL:是Spark用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用 SQL或者Apache Hive版本的 HQL 来查询数据。Spark SQL支持多种数据源,比如 Hive 表、Parquet以及JSON等。

在这里插入图片描述

2、Spark Shuffle解析

2.1 HashShuffle

  1. 未经优化的 HashShuffleManager
    在这里插入图片描述
  2. 优化后的 HashShuffleManager
    在这里插入图片描述

2.2 SortShuffle

在这里插入图片描述

3、执行计划处理流程

先看下从一个 sql 转化成 Rdd 的过程:
在这里插入图片描述
核心的执行过程一共有 5 个步骤:
在这里插入图片描述
这些操作和计划都是 Spark SQL 自动处理的,会生成以下计划:
Unresolved 逻辑执行计划:Parsed Logical Plan
Parser 组件检查 SQL 语法上是否有问题,比如少写个逗号,少写个FROM,然后生成 Unresolved(未决断)的逻辑计划, 不检查表名、不检查列名。
Resolved 逻辑执行计划:Analyzed Logical Plan
通过访问 Spark 中的 Catalog 存储库来解析验证语义、列名、类型、表名等,就是说验证表名列名到底在不在。
➢ 优化后的逻辑执行计划:Optimized Logical Plan
Catalyst 优化器根据各种规则进行优化,比如谓词下推。
➢ 物理执行计划:Physical Plan
1)HashAggregate 运算符表示数据聚合,一般 HashAggregate 是成对出现,第一个 HashAggregate 是将执行节点本地的数据进行局部聚合,另一个 HashAggregate 是 将各个分区的数据进一步进行聚合计算。
2)Exchange 运算符其实就是 shuffle,表示需要在集群上移动数据。很多时候 HashAggregate 会以 Exchange 分隔开来。
3)Project 运算符是 SQL 中的投影操作,就是选择列(例如:select name, age…)。
4)BroadcastHashJoin 运算符表示通过基于广播方式进行 HashJoin
5)LocalTableScan 运算符就是全表扫描本地的表
CBO代价选择:选择最优的执行计划

4、SparkSQL 语法优化

4.1 大小表join

如果当一张小表足够小并且可以先缓存到内存中,那么可以使用 Broadcast Hash Join,其原理就是先将小表聚合到 driver 端,再广播到各个大表分区中,那么 再次进行 join 的时候,就相当于大表的各自分区的数据与小表进行本地 join,从而规避了 shuffle
1)通过参数指定自动广播 广播 join 默认值为 10MB
spark.sql.autoBroadcastJoinThreshold 参数控制。
2)强行广播join
语法: SELECT /*+ broadcast(a) */ FROM a JOIN b ON

4.2 大表和大表join

SMB JOINsort merge bucket 操作,需要进行分桶,首先会进行排序,然后根据 key 值合并,把相同 key 的数据放到同一个 bucket 中(按照 key 进行 hash)。分桶的目的其实 就是把大表化成小表。相同 key 的数据都在同一个桶中之后,再进行 join 操作,那么在联 合的时候就会大幅度的减小无关项的扫描。
使用条件:
(1)两表进行分桶,桶的个数必须相等
(2)两边进行 join 时,join 列=排序列=分桶列

5、基于 RBO 的优化

5.1 谓词下推(Predicate Pushdown)

将 过 滤 条 件 的 谓 词 逻 辑 都 尽 可 能 提 前 执 行 , 减 少 下 游 处 理 的 数 据 量 。下推的谓词能够大幅减少数据扫描量,降低磁盘 I/O 开销。

5.2 列剪裁(Column Pruning)

列剪裁就是扫描数据源的时候,只读取那些与查询相关的字段。

5.3 常量替换(Constant Folding)

我们在 select 语句中,掺杂了一些 常量表达式,Catalyst 也会自动地用表达式的结果进行替换。

6、基于 CBO 的优化

上文介绍的 RBO 属于逻辑计划的优化,只考虑查询,未考虑数据本身的特点。下面将介绍 CBO 如何利用数据本身的特点优化物理执行计划。
CBO 优化主要在物理计划层面,原理是计算所有可能的物理计划的代价,并挑选出代价最小的物理执行计划。充分考虑了数据本身的特点(如大小、分布)以及操作算子的特点(中间结果集的分布及大小)及代价,从而更好的选择执行代价最小的物理执行计划。

6.1 官方实验

CBO优化前:
在这里插入图片描述
CBO优化后:
在这里插入图片描述
物理执行计划是一个树状结构,其代价等于每个执行节点的代价总合,如下图所示。
在这里插入图片描述
而每个执行节点的代价,分为两个部分
该执行节点对数据集的影响,或者说该节点输出数据集的大小与分布

  • 该执行节点操作算子的代价
  • 每个操作算子的代价相对固定,可用规则来描述。而执行节点输出数据集的大小与分布,分为两个部分:
    1. 初始数据集,也即原始表,其数据集的大小与分布可直接通过统计得到;
    2. 中间节点输出数据集的大小与分布可由其输入数据集的信息与操作本身的特点推算。

所以,最终主要需要解决两个问题

  1. 如何获取原始数据集的统计信息
  2. 如何根据输入数据集估算特定算子的输出数据集

6.2 CBO如何优化

1 Statistics 收集(相关信息提前收集好)

需要先执行特定的 SQL 语句来收集所需的表和列的统计信息。
➢ 生成表级别统计信息(扫表):

ANALYZE TABLE 表名 COMPUTE STATISTICS

生成 sizeInBytes (这张表的大小)和 rowCount(这张表多少行)。
从如下示例中,Statistics 一行可见, customer 表数据总大小为 37026233 字节,即 35.3MB,总记录数为 28万。

spark-sql> ANALYZE TABLE customer COMPUTE STATISTICS;
Time taken: 12.888 seconds
​
spark-sql> desc extended customer;
c_customer_sk bigint   NULL
c_customer_id string   NULL
c_current_cdemo_sk     bigint NULL
c_current_hdemo_sk     bigint NULL
c_current_addr_sk       bigint NULL
c_first_shipto_date_sk bigint NULL
c_first_sales_date_sk   bigint NULL
c_salutation   string   NULL
c_first_name   string   NULL
c_last_name   string   NULL
c_preferred_cust_flag   string NULL
c_birth_day   int     NULL
c_birth_month int     NULL
c_birth_year   int     NULL
c_birth_country string NULL
c_login string NULL
c_email_address string NULL
c_last_review_date     string NULL# Detailed Table Information
Database       jason_tpc_ds
Table   customer
Owner   jason
Created Time   Sat Sep 15 14:00:40 CST 2018
Last Access   Thu Jan 01 08:00:00 CST 1970
Created By     Spark 2.3.2
Type   EXTERNAL
Provider       hive
Table Properties       [transient_lastDdlTime=1536997324]
Statistics     37026233 bytes, 280000 rows
Location       hdfs://dw/tpc_ds/customer
Serde Library org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat   org.apache.hadoop.mapred.TextInputFormat
OutputFormat   org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Storage Properties     [field.delim=|, serialization.format=|]
Partition Provider     Catalog
Time taken: 1.691 seconds, Fetched 36 row(s)

➢ 生成列级别统计信息

ANALYZE TABLE 表名 COMPUTE STATISTICS FOR COLUMNS1,2,3

从如下示例可见,customer 表的 c_customer_sk 列最小值为 1, 最大值为 280000null 值个数为 0,不同值个数为 274368,平均列长度为 8,最大列长度为 8

spark-sql> ANALYZE TABLE customer COMPUTE STATISTICS FOR COLUMNS c_customer_sk, c_customer_id, c_current_cdemo_sk;
Time taken: 9.139 seconds
spark-sql> desc extended customer c_customer_sk;
col_name       c_customer_sk
data_type     bigint
comment NULL
min     1
max     280000
num_nulls     0
distinct_count 274368
avg_col_len   8
max_col_len   8
histogram     NULL

2 算子对数据集影响估计

对于中间算子,可以根据输入数据集的统计信息以及算子的特性,可以估算出输出数据集的统计结果。
在这里插入图片描述

本节以 Filter 为例说明算子对数据集的影响。
对于常见的 Column A < value B Filter,可通过如下方式估算输出中间结果的统计信息

  • A.min > B,则无数据被选中,输出结果为空
  • A.max < B,则全部数据被选中,输出结果与 A 相同,且统计信息不变
  • A.min < B < A.max,则被选中的数据占比为 (B.value - A.min) / (A.max - A.min)A.min 不变,A.max 更新为 B.value

3 算子代价估计

SQL 中常见的操作有 Selection(由 select 语句表示),Filter(由 where 语句表示)以及笛卡尔乘积(由 join 语句表示)。其中代价最高的是 join
Spark SQLCBO 通过如下方法估算 join 的代价

Cost = rows * weight + size * (1 - weight)
Cost = CostCPU * weight + CostIO * (1 - weight)

其中 rows 即记录行数代表了 CPU 代价,size 代表了 IO 代价。weightspark.sql.cbo.joinReorder.card.weight 决定,其默认值为 0.7

6.3 CBO优化Build侧选择

对于两表Hash Join,一般选择小表作为build size,构建哈希表,另一边作为 probe side。未开启 CBO 时,根据表原始数据大小选择 t2 作为build side
在这里插入图片描述
开启 CBO 后,基于估计的代价选择 t1 作为 build side。更适合本例
在这里插入图片描述

6.4 优化 Join 类型

Spark SQL 中,Join 可分为 Shuffle based JoinBroadcastJoinShuffle based Join 需要引入 Shuffle,代价相对较高。BroadcastJoin 无须 Join,但要求至少有一张表足够小,能通过 SparkBroadcast 机制广播到每个 Executor 中。
在不开启 CBO 中,Spark SQL 通过 spark.sql.autoBroadcastJoinThreshold 判断是否启用 BroadcastJoin。其默认值为 1048576010 MB。并且该判断基于参与 Join 的表的原始大小。
在下图示例中,Table 1 大小为 1 TBTable 2 大小为 20 GB,因此在对二者进行 join 时,由于二者都远大于自动 BroatcastJoin 的阈值,因此 Spark SQL 在未开启 CBO 时选用 SortMergeJoin 对二者进行 Join
而开启 CBO 后,由于 Table 1 经过 Filter 1 后结果集大小为 500 GBTable 2 经过 Filter 2 后结果集大小为 10 MB 低于自动 BroatcastJoin 阈值,因此 Spark SQL 选用 BroadcastJoin

在这里插入图片描述

6.5 优化多表 Join 顺序

未开启 CBO 时,Spark SQLSQLjoin 顺序进行 Join。极端情况下,整个 Join 可能是 left-deep tree。在下图所示 TPC-DS Q25 中,多路 Join 存在如下问题。

  1. left-deep tree,因此所有后续 Join 都依赖于前面的 Join 结果,各 Join 间无法并行进行。
  2. 前面的两次Join输入输出数据量均非常大,属于大 Join,执行时间较长。

在这里插入图片描述
开启 CBO 后, Spark SQL 将执行计划优化如下:
在这里插入图片描述

6.6 使用 CBO

通过 “spark.sql.cbo.enabled” 来开启,默认是 false。配置开启 CBO 后,CBO 优化器可以 基于表和列的统计信息,进行一系列的估算,最终选择出最优的查询计划。比如:Build 侧 选择、优化 Join 类型、优化多表 Join 顺序等。
下面是相关参数的说明:
在这里插入图片描述

总结

本文首先讲解了 Spark 的底层的 Shuffle 的调优以及从 SQLRDD的生成执行计划的整个处理流程,其次是 Spark SQL 语法优化,最后梳理了 Spark SQL 是如何基于 RBOCBO 的进行优化的!

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

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

相关文章

安科瑞智慧空开微型断路器在银行的应用-安科瑞黄安南

应用场景 智能微型断路器与智能网关组合应用于末端回路 功能 1.计量功能&#xff1a;实时上报电压、电流、功率、电能、漏电、温度、频率等电参量&#xff1b; 2.报警功能&#xff1a;过压报警、欠压报警、过流报警、过载报警、漏电报警、超温报警、三相电缺相报警&#xff…

论文笔记:Adjusting for Autocorrelated Errors in Neural Networks for Time Series

2021 NIPS 原来的时间序列预测任务是根据预测论文提出用一阶自回归误差预测 一阶差分&#xff0c;类似于ResNet的残差思路&#xff1f;记为pred&#xff0c;最终的预测结果

【蓝桥杯备考资料】如何进入国赛?

目录 写在前面注意事项数组、字符串处理BigInteger日期问题DFS 2013年真题Java B组世纪末的星期马虎的算式振兴中华黄金连分数有理数类&#xff08;填空题&#xff09;三部排序&#xff08;填空题&#xff09;错误票据幸运数字带分数连号区间数 2014年真题蓝桥杯Java B组03猜字…

维护电脑,让“战友”保持长寿命

目录 维护电脑&#xff0c;让“战友”保持长寿命介绍你的电脑介绍一下你的日常维护措施给出一些你觉得有用的维护技巧不推荐做些什么其他补充总结 无论是学习还是工作&#xff0c;电脑都是IT人必不可少的重要武器&#xff0c;一台好电脑除了自身配置要经得起考验&#xff0c;后…

Linux内核的I2C驱动框架详解------这应该是我目前600多篇博客中耗时最长的一篇博客

目录 1 I2C驱动整体框架图 2 I2C控制器 2.1 I2C控制器设备--I2C控制器在内核中也被看做一个设备 2.2 i2c控制器驱动程序 2.3 platform_driver结构体中的probe函数做了什么 2.3.1 疑问&#xff1a; i2cdev_notifier_call函数哪里来的 2.3.2 疑问&#xff1a;为什么有两…

2023 ISSE观察:智能遮阳窗帘行业蓬勃发展,AI设计引热议

7月31日&#xff0c;上海国际智能遮阳与建筑节能展览会落下帷幕。作为智能遮阳的行业展会&#xff0c;展会三天&#xff0c;现场热闹非凡&#xff0c;参展商和观展者络绎不绝。 作为一大行业盛事&#xff0c;2023 ISSE展会方打造了五大展区&#xff0c;除了提供系统门窗装修方案…

二、SQL-6.DCL-1).用户管理

一、DCL介绍 Data Control Language 数据控制语言 用来管理数据库 用户、控制数据库的 访问权限。 二、语法 1、管理用户 管理用户在系统数据库mysql中的user表中创建、删除一个用户&#xff0c;需要Host&#xff08;主机名&#xff09;和User&#xff08;用户名&#xff0…

openGauss学习笔记-26 openGauss 高级数据管理-约束

文章目录 openGauss学习笔记-26 openGauss 高级数据管理-约束26.1 NOT NULL约束26.2 UNIQUE约束26.3 PRIMARY KEY26.4 FOREIGN KEY26.5 CHECK约束 openGauss学习笔记-26 openGauss 高级数据管理-约束 约束子句用于声明约束&#xff0c;新行或者更新的行必须满足这些约束才能成…

基于SHARC+®单核的ADSP-21567KBCZ6、ADSP-21566BBCZ4、ADSP-21566KBCZ4高性能DSP处理器产品

ADSP-2156x 处理器的速度高达 1 GHz&#xff0c;属于 SHARC 系列产品。ADSP-2156x 处理器基于 SHARC 单核。ADSP-2156x SHARC 处理器是 SIMD SHARC 系列数字信号处理器 (DSP) 中的一款产品&#xff0c;采用 ADI 的超级哈佛架构。这些 32 位/40 位/64 位浮点处理器已针对高性能音…

Rust vs Go:常用语法对比(九)

题图来自 Golang vs Rust - The Race to Better and Ultimate Programming Language 161. Multiply all the elements of a list Multiply all the elements of the list elements by a constant c 将list中的每个元素都乘以一个数 package mainimport ( "fmt")func …

Android Unit Test

一、测试基础知识 1.1 测试级别 测试金字塔&#xff08;如图 2 所示&#xff09;说明了应用应如何包含三类测试&#xff08;即小型、中型和大型测试&#xff09;&#xff1a; 小型测试是指单元测试&#xff0c;用于验证应用的行为&#xff0c;一次验证一个类。 中型测试是指…

创造自己的宠物医院预约服务小程序,步骤详解

在现代社会&#xff0c;越来越多的人开始养宠物&#xff0c;而宠物的健康管理也成为了一个重要的话题。为了方便宠物主人随时随地进行宠物医院的管理和服务&#xff0c;开发一个宠物医院管理小程序是很有必要的。今天我们将分享一些制作宠物医院管理小程序的技巧&#xff0c;帮…

Vue没有node_modules怎么办

npm install 一下 然后再npm run serve 就可以运行了

基于多任务学习卷积神经网络的皮肤损伤联合分割与分类

文章目录 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network摘要本文方法实验结果 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network 摘要 在…

Python实现GA遗传算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

青龙面板的安装和使用

玩nas除了看看电影&#xff0c;那肯定还得玩转docker&#xff0c;这期讲的就是青龙面板&#xff0c;一个跑脚本的神器。 GitHub地址&#xff1a;青龙面板 1.安装 你安装完docker那就很简单了&#xff0c;不懂可以看看我这篇博客docker安装 镜像源一定要搞&#xff0c;要不然…

bigemap工程工程行业应用

客户目前主要是需求为使用下载卫星图、等高线、水系、路网等等元素数据做线路规划图 其他信息 客户需要的图中还包含一些农作物以及需要在软件上标注带有箭头的线段&#xff08;不能满足&#xff09; 如下图&#xff1a; 使用场景&#xff1a; 目前主要为制图、规划线路等等…

1.1.2 SpringCloud 版本问题

目录 版本标识 版本类型 查看对应版本 版本兼容的权威——官网&#xff1a; 具体的版本匹配支持信息可以查看 总结 在将Spring Cloud集成到Spring Boot项目中时&#xff0c;确保选择正确的Spring Cloud版本和兼容性是非常重要的。由于Spring Cloud存在多个版本&#xff0c;因此…

力扣 509. 斐波那契数

题目来源&#xff1a;https://leetcode.cn/problems/fibonacci-number/description/ C题解1&#xff1a;根据题意&#xff0c;直接用递归函数。 class Solution { public:int fib(int n) {if(n 0) return 0;else if(n 1) return 1;else return(fib(n-1) fib(n-2));} }; C题…

socket 基础

Socket是什么呢&#xff1f; ① Socket通常也称作“套接字”&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。 ② Socket是连接运行在网络上的两个程序间的双向通信的端点。 ③ 网络通讯其实指…