Spark3 新特性之AQE

Spark 自适应查询执行(AQE) AQE 是 Spark SQL 的一种动态优化机制,它的诞生解决了 RBO、CBO,这些启发式、静态优化机制的局限性。想要用好 AQE,我们就要掌握它的特点,以及它支持的三种优化特性的工作原理和使用方法。如果用一句话来概括 AQE 的定义,就是每当 Shuffle Map 阶段执行完毕,它都会结合这个阶段的统计信息,根据既定的规则和策略动态地调整、修正尚未执行的逻辑计划和物理计划,从而完成对原始查询语句的运行时优化。 阅读详情
AI摘要

Spark3的AQE特性通过动态优化,包括自动分区合并、数据倾斜处理和Join策略调整,解决了Spark2.x中数据倾斜和执行效率问题。在运行时,AQE结合统计信息调整逻辑和物理计划,改善了任务执行的时间和资源利用率。对比验证显示,开启AQE显著减少了执行时间,提高了任务性能。

Spark3 AQE

一、 背景

Spark 2.x 在遇到有数据倾斜的任务时,需要人为地去优化任务,比较费时费力;如果任务在Reduce阶段,Reduce Task 数据分布参差不齐,会造成各个excutor节点资源利用率不均衡,影响任务的执行效率;Spark 3新特性AQE极大地优化了以上任务的执行效率。

二、 Spark 为什么需要AQE? (Why)

RBO(Rule Based Optimization,基于规则的优化),它往往基于一些规则和策略实现,如谓词下推、列剪枝,这些规则和策略来源于数据库领域已有的应用经验。RBO实际上算是一种经验主义。

经验主义的弊端就是对待相似的问题和场景都使用同一类套路。Spark 社区正是因为意识到了 RBO 的局限性,因此在 2.x 版本中推出了CBO(Cost Based Optimization,基于成本的优化)。

CBO 是基于数据表的统计信息(如表大小、数据列分布)来选择优化策略。CBO 支持的统计信息很丰富,比如数据表的行数、每列的基数(Cardinality)、空值数、最大值、最小值等。因为有统计数据做支持,所以 CBO 选择的优化策略往往优于 RBO 选择的优化规则。

但是,CBO 也有三个方面的不足:

  • 适用面太窄,CBO 仅支持注册到 Hive Metastore 的数据表,但在其他的应用场景中,数据源往往是存储在分布式文件系统的各类文件,如 Parquet、ORC、CSV 等。

  • 统计信息的搜集效率比较低。对于注册到 Hive Metastore 的数据表,开发者需要调用 ANALYZE TABLE COMPUTE STATISTICS 语句收集统计信息,而各类信息的收集会消耗大量时间。

  • 静态优化,RBO、CBO执行计划一旦制定完成,就会按照该计划坚定不移地执行;如果在运行时数据分布发生动态变化,先前制定的执行计划并不会跟着调整、适配。

基于CBO的执行计划
在这里插入图片描述

  • Spark parses the query and creates the Unresolved Logical Plan 创建Unresolved Logical Plan
    • Validates the syntax of the query. 验证语法
    • Doesn’t validate the semantics meaning column name existence, data types. 不验证语义、字段是否存在、数据类型
  • Analysis: Using the Catalyst, it converts the Unresolved Logical Plan to Resolved Logical Plan a.k.a Logical Plan. 转换为Logical Plan
    • The catalog contains the column names and data types, during this step, it validates the columns mentioned in a query with catalog.
  • Optimization: Converts Logical Plan into Optimized Logical Plan. 转换为 Optimized Logical Plan
  • Planner: Now it creates One or More Physical Plans from an optimized Logical plan. 创建一个或多个Physical Plans
  • Cost Model: In this phase, calculates the cost for each Physical plan and select the Best Physical Plan. CBO择优
  • RDD Generation: RDD’s are generated, this is the final phase of query optimization which generates RDD in Java bytecode.

三、 AQE 到底是什么?(What)

考虑到 RBO 和 CBO 的种种限制,Spark 在 3.0 版本推出了 AQE(Adaptive Query Execution,自适应查询执行)。用一句话来概括,AQE 是 Spark SQL 的一种动态优化机制,在运行时,每当 Shuffle Map 阶段执行完毕,AQE 都会结合这个阶段的统计信息,基于既定的规则动态地调整、修正尚未执行的逻辑计划和物理计划,来完成对原始查询语句的运行时优化。

AQE 赖以优化的统计信息与 CBO 不同,这些统计信息并不是关于某张表或是哪个列,而是 Shuffle Map 阶段输出的中间文件。

基于AQE的执行计划
在这里插入图片描述

四、AQE怎么用?(How)

AQE三大特性:自动分区合并 、自动数据倾斜处理、Join 策略调整

4.1 自动分区合并

在 Shuffle 过后,Reduce Task 数据分布参差不齐,AQE 将自动合并过小的数据分区。

那么AQE是如何确定多小的分区需要合并,以及分区合并到多大时停止合并?

对于所有的数据分区,无论大小,AQE 按照分区编号从左到右进行扫描,边扫描边记录分区尺寸,当相邻分区的尺寸之和大于 “推荐尺寸”时,AQE 就把这些扫描过的分区进行合并。然后,继续向右扫描,并采用同样的算法,按照目标尺寸合并剩余分区,直到所有分区都处理完毕。

“推荐尺寸”是由spark.sql.adaptive.advisoryPartitionSizeInBytes设置

配置说明
spark.sql.adaptive.coalescePartitions.enabledWhen true and ‘spark.sql.adaptive.enabled’ is true, Spark will coalesce contiguous shuffle partitions according to the target size (specified by ‘spark.sql.adaptive.advisoryPartitionSizeInBytes’), to avoid too many small tasks.
开启分区自动合并,默认开启
spark.sql.adaptive.advisoryPartitionSizeInBytesThe advisory size in bytes of the shuffle partition during adaptive optimization (when spark.sql.adaptive.enabled is true). It takes effect when Spark coalesces small shuffle partitions or splits skewed shuffle partition.
分区合并后的推荐尺寸,默认为64M
spark.sql.adaptive.coalescePartitions.minPartitionSizeThe minimum size of shuffle partitions after coalescing. This is useful when the adaptively calculated target size is too small during partition coalescing.
可合并分区尺寸大小,默认为1M

假设推荐尺寸为100M,shuffle后每一个分区的大小为70M、30M、80M、90M、10M、20M

按照正常情况(顺序处理),会启动4个reduce task:

第一个处理:70M、30M

第二个处理:80M

第三个处理:90M

第四个处理:10M、20M

spark3.0版本按照上述情况合并之后,各分区数据还是出现了不均衡,从而导致后续计算出现小的数据倾斜

查看spark 3.2官网新增了 spark.sql.adaptive.coalescePartitions.minPartitionSize(合并分区后,最小分区尺寸),如果把该参数设置为和推荐尺寸一致,那是不是只会启动3个 reduce task,3个都处理100M的数据?(个人猜想,不是按照顺序合并,而是会先遍历分区大小,保证合并后的分区大小相近)

You do not need to set a proper shuffle partition number to fit your dataset. Spark can pick the proper shuffle partition number at runtime once you set a large enough initial number of shuffle partitions via spark.sql.adaptive.coalescePartitions.initialPartitionNum configuration. 官方建议:分区数不用设置,spark会自动设置合适的分区。

4.2 自动数据倾斜处理

AQE 自动拆分 Reduce 阶段过大的数据分区,降低单个Reduce Task 的工作负载。

AQE 如何判定数据分区是否倾斜呢?它又是怎么把大分区拆分成多个小分区的?

配置说明
spark.sql.adaptive.skewJoin.enabledWhen true and ‘spark.sql.adaptive.enabled’ is true, Spark dynamically handles skew in shuffled join (sort-merge and shuffled hash) by splitting (and replicating if needed) skewed partitions.
开启AQE自动数据倾斜处理
spark.sql.adaptive.skewJoin.skewedPartitionFactorA partition is considered as skewed if its size is larger than this factor multiplying the median partition size and also larger than ‘spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes’
判定数据分区是否倾斜,默认值为5
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytesA partition is considered as skewed if its size in bytes is larger than this threshold and also larger than ‘spark.sql.adaptive.skewJoin.skewedPartitionFactor’ multiplying the median partition size. Ideally this config should be set larger than ‘spark.sql.adaptive.advisoryPartitionSizeInBytes’.
判定数据分区是否倾斜,默认值为256M

判定倾斜分区:大于 median partition size * spark.sql.adaptive.skewJoin.skewedPartitionFactor 且 大于 spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes

假设数据表 A 有 3 个分区,分区大小分别是80MB、100MB 和 512MB。这些分区按大小个排序后的中位数是 100MB,因为

skewedPartitionFactor 的默认值是 5 ,skewedPartitionThresholdInBytes默认值是256M,512M大于 100MB * 5 = 500MB且大于256M 的分区被判定为倾斜分区。

拆分倾斜分区:上述例子512M分区会被拆分 512/256 =2个分区

4.3 Join 策略调整

如果某张表在过滤之后,尺寸小于广播变量阈值,这张表参与的数据关联就会从 Shuffle Sort Merge Join 降级(Demote)为执行效率更高的 Broadcast Hash Join。

Join 策略调整指的就是 Spark SQL在运行时动态地将原本的 Shuffle Join 策略,调整为执行更加高效的 Broadcast Join。

具体来说,每当 DAG 中的 Map 阶段执行完毕,Spark SQL 就会结合 Shuffle 中间文件的统计信息,重新计算 Reduce 阶段数据表的存储大小。如果发现基表尺寸小于广播阈值, 那么 Spark SQL 就把下一阶段的 Shuffle Join 调整为 Broadcast Join。

Broadcast Join 以广播的方式将小表的全量数据分发到集群中所有的 Executors,大表的数据就可以与小表数据在Process local级别进行关联操作。本地性级别有 4 种:Process local < Node local < Rack local < Any。

配置说明
spark.sql.adaptive.autoBroadcastJoinThresholdConfigures the maximum size in bytes for a table that will be broadcast to all worker nodes when performing a join. By setting this value to -1 broadcasting can be disabled. The default value is same with spark.sql.autoBroadcastJoinThreshold. Note that, this config is used only in adaptive framework.
可广播的表尺寸阈值,默认10M

五、对比验证

spark3.2 开启AQE

http://szzb-bg-uat-etl-16:18080/history/application_1665940579703_5390/

spark3.2 关闭AQE

http://szzb-bg-uat-etl-16:18080/history/application_1665940579703_5812/

spark2.2 无AQE

http://szzb-bg-uat-etl-11:18080/history/application_1665940579703_9257/

5.1 执行耗时

使用资源: --driver-memory 6g --executor-memory 6g --executor-cores 6

耗时
spark3.2 开启AQE4.3 min
spark3.2 关闭AQE6.7 min
spark2.2 无AQE> 9.6min (OOM)
5.2 自动分区合并

在这里插入图片描述

5.3 自动数据倾斜处理

查看各stage执行时间

  • spark3.2 开启AQE 每个stage执行时间相差不大 (需要看每个stage的tasks )

  • spark2.2 无AQE 每个stage执行时间相差较大 (需要看每个stage的tasks )
    在这里插入图片描述

查看执行时间最长的stage数据分布

  • spark3.2 开启AQE Shuffle Read/Write 数据较均衡

  • spark2.2 无AQE Shuffle Read/Write 数据不均衡

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GB5NWCsF-1677203632031)(C:\Users\602946\AppData\Roaming\Typora\typora-user-images\image-20221019110500813.png)]

六、结论

spark3.2.2 开启AQE(默认开启),当Reduce Task 数据分布参差不齐时,能够自动合并过小的数据分区;且在 Reduce 阶段存在数据倾斜的情况下,能够拆分大分区;通过对比执行时间,AQE能极大的提升任务的执行效率。

spark-AQE/Tungsten介绍及其触发条件 定义:Spark 3.0引入的自适应查询优化技术运行时动态调整执行计划。核心能力动态分区合并:自动合并小分区以减少Shuffle数据量。自动Broadcast Join:根据数据量动态切换Join策略。Skew Join优化:识别数据倾斜并自动调整分区策略。配置参数Tungsten(钨丝计划)定义:Spark 1.6推出的底层性能优化框架,通过内存管理和代码生成提升效率。关键技术内存列式存储:减少内存占用并提升缓存利用率。代码生成(Codegen):动态生成JVM字节码替代解释执行。 阅读详情

相关推荐

Spark3 AQE (Adaptive Query Execution) 一文搞懂 新特性

Spark3 新特性 AQE Adaptive Query Execution 原理 代码 讲解

青冬的博客 5265

Spark AQE

Spark 3.0 添加了自适应查询执行(AQE)、动态分区剪裁(DPP)、扩展的 Join Hints。

记录点点滴滴 1264

spark在执行中如何选择shuffle策略

综上,Spark通过数据量、内存、并行度等动态选择Shuffle策略,并提供丰富的参数和AQE机制实现自适应优化。对于大规模或复杂场景,建议开启AQE并结合Join Hint进行精细化控制。CSS通过预分区和顺序读取优化Shuffle性能,避免本地磁盘依赖。

认真学代码的shell 1190

Spark AQE(Adaptive Query Execution)机制

AQE 的全称是 Adaptive Query Execution,翻译过来是“自适应查询执行”。它包含了 3 个动态优化特性,分别是 Join 策略调整、自动分区合并和自动倾斜处理。

fanghailiang2016的博客 2223

大数据技术Spark3.0企业级实战

精准一次消费是结构化流设计的主要目标之一,为此结构化有接收器和执行引擎,可以可靠地跟踪处理确切的进度,以便结构化流可以通过重新启动或/重新处理来处理任何类型的故障。例如流数据源Kafka,结构化流可以跟踪对应偏移量读取位置,引擎使用checkpoint和wal预写日志记录每个trigger触发器的偏移量。结构化流可以重播源数据和幂等的接收器,确保精准一次消费。

悦分享 183

大数据技术Spark3.0详解

Spark3.0版本包含了3400多个补丁程序,是开源社区做出巨大贡献的最高峰,带来了Python和SQL功能的重大进步,并着眼于探索和生产的易用性。

悦分享 2465

Spark3.0新特性AQE DPP

在我们执⾏过程中转化为Broadcast Hash Join的同时,我们甚⾄可以将传统shuffle优化为本地shuffle(例如shuffle读在mapper⽽不是基于reducer)来减⼩⽹络开销。Spark ⽀持的许多 Join 策略中,Broadcast Hash Join通常是性能最好的,前提是参加 join 的。⼤⼩为15M,⽽在该场景下,经过filter过滤后,实际参与join的数据⼤⼩为8M,⼩于了默认。在我们处理的数据量级⾮常⼤时,shuffle通常来说是最影响性能的。

u012106430的博客 1403

Spark 新特性+核心回顾

Spark 新特性+核心回顾

是个吃不饱的人 688

Spark3.0新特性-AQE

想要更全面了解Spark内核和应用实战,可以购买我的新书。 《图解Spark 大数据快速分析实战》(王磊)【摘要 书评 试读】- 京东图书https://item.jd.com/13613302.html AQE 1.AQE的概念 Spark SQL是Spark开发中使用最广泛的引擎,它使得我们通过简单的几条SQL语句就能完成海量数据(TB或PB级数据)的分析。 AQE(Adaptive Query Execution,自适应查询执行)的作用是对正在执行的查询任务进行优化。AQE使Spark计划.

wangleigiser的博客 4356

UE5.3.2 + VS2022社区版在Win11上的C++编译环境配置全解

Unreal Engine 5的C++开发依赖严格的工具链协同,其核心在于Visual Studio编译器版本、Windows SDK与引擎构建系统(UBT)的精准匹配。UE5.3.2强制要求MSVC v143.4(即VS2022 17.4+)及Windows 11 SDK 10.0.22621.0,任何偏差都会引发LNK2019链接失败、C1083头文件缺失或MSB8066构建中断等典型错误。该配置不仅关乎安装顺序,更涉及注册表清理、PATH环境变量、SDK路径注入与运行时DLL加载等底层机制。适用于Wi

weixin_33978722的博客 367

Benchmark系列——基本概念和分类

本文主要介绍了Benchmark的基本概念和分类情况。

Bluetangos的博客 8438

Spark 3.x 新特性解析:AQE 增强、Dynamic Partition Pruning 与 ANSI SQL 支持

本文深入解析Spark 3.x的三大核心新特性:自适应查询引擎(AQE)、动态分区裁剪(Dynamic Partition Pruning)与增强的ANSI SQL支持。通过详细的技术原理、配置方法与实战案例,帮助开发者充分利用Spark 3.x的性能优化能力,提升大数据处理效率。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 696

基于OFDM的实时图像传输系统MATLAB仿真:MPSK与MQAM调制性能对比与误码率分析

本文详细介绍了基于OFDM的实时图像传输系统在MATLAB中的仿真实现,重点对比了MPSK与MQAM调制方式的性能差异与误码率分析。通过搭建OFDM系统模型,探讨了QPSK和16QAM在不同信道条件下的表现,包括频谱效率、抗噪能力和误码率等关键指标。文章还提供了MATLAB代码示例和实用技巧,帮助读者快速掌握OFDM图像传输系统的核心算法与优化方法。

weixin_29064009的博客 355

【Spark重点难点08】Spark3.0中的AQE和DPP小总结

点击上方蓝色字体,选择“设为星标”回复”面试“获取更多惊喜本文已加入「大数据成神之路PDF版」提供下载。后台回复:「PDF」即可获取。更多PDF下载可以参考:《重磅,大数据成神之路PDF...

微信搜:import_bigdata,大数据领域硬核原创作者 2318

华为OD机试真题 新系统 9月20号 【字符串分组求和】

华为OD新系统机试真题【字符串分组求和】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串分组求和】解析。

qq_45776114的博客 624

duilib 实现截屏选取功能分析

本文关注点不再截屏而是截屏选取工具 1首先肯定是个透明窗口,且置顶并且是工具窗口(任务栏不显示窗口图标) 窗口样式 <?xml version="1.0" encoding="utf-8"?> <Window shadowattached="false"> <Box > <VBox name="track_box" margin="200,200,200,200" bkimage="file='screen_bord...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 908

Spark 3 新特性

Spark 3.0.0正式版发布,开发近两年新增了哪些特性? - 大数据 - dbaplus社群:围绕Data、Blockchain、AiOps的企业级专业社群。技术大咖、原创干货,每天精品原创文章推送,每周线上技术分享,每月线下技术沙龙。 介绍较详细。 介绍了 AQE 和 DPP 的来源背景:基于动态统计信息的优化 Spark3.0 新特性(部分) - 知乎 介绍了与数仓模型之间的联系: 基于运行时推断的信息来进一步进行分区裁剪。这在星型模型中很常见,星型模型是由一个或多个并且引用了任意

MISAYAONE的博客 4170

【WRF数据准备】土地利用数据-MODIS MCD12Q1数据下载及制备

【WRF数据准备】MODIS静态地理数据下载及制备

WW、forever的博客 3413

各位大佬,Spark的重点难点系列暂时更新完毕

点击上方蓝色字体,选择“设为星标”回复”面试“获取更多惊喜本文已经加入「大数据成神之路PDF版」中提供下载。你可以关注公众号,后台回复:「PDF」即可获取。更多PDF下载可以参考:《重磅...

微信搜:import_bigdata,大数据领域硬核原创作者 3302

YOLO格式数据集划分

YOLO格式的数据集划分 标题标签格式txt import os import cv2 import random from PIL import Image # os.makedirs('labels_train') # os.makedirs('labels_val') img_train_path ='./img_train/' #图片训练集保存路径 img_val_path = './img_val/' #图片验证集保存路径 labels_train_path = './labels_t

weixin_51154380的博客 3308

软考中级-软件设计师 知识点整理(一篇就过了 建议收藏)

软考中级-软件设计师上午题知识点总结

片言可决讼,半纸能缚龙 17万+

【Apache Spark 】第 12 章结语:Apache Spark 3.0

我们还探索了实验性 Catalog API 如何将 Spark 生态系统扩展到自定义数据存储,用于批处理和流数据的源和接收器,并研究了 Spark 3.0 中的新调度程序,该调度程序使其能够利用执行程序中的 GPU。这样,作为对事实表的文件扫描操作的一部分,只扫描与过滤器匹配的分区,并且只读取需要的数据。中 Spark UI 讨论的补充,我们还向您展示了新的 Structured Streaming 选项卡,提供有关流式作业的累积统计信息、额外的可视化以及每个查询的详细指标。选项包括(默认)、、、、和。

sikh_0529的博客 644

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spark SQL新特性

Spark SQL内核调优

wangleigiser的博客 897

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spark核心原理

文章目录

zjh17393161150的博客 269

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spark3.0调优学习

1、现象绝大多数task运行速度很快,但是就是有那么几个task任务运行极其缓慢,慢慢的可能就会报内存溢出异常。2、原因数据倾斜一般发生在shuffle类的算子,比如distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup等,涉及到数据重分区,如果其中某一个key 数量特别大,就发生了数据倾斜。

qq_37187606的博客 1021

Spark 3.0实战:从环境搭建到性能调优的完整指南

在大数据处理领域,分布式计算框架是处理海量数据的核心技术。其核心原理在于将大规模数据集分割成多个分区,通过并行计算集群进行高效处理,从而突破单机性能瓶颈。这项技术的核心价值在于能够显著提升数据处理效率,降低计算成本,并支持复杂的分析任务。它广泛应用于日志分析、用户行为统计、机器学习特征工程等场景。本文聚焦于Apache Spark 3.0这一主流框架,深入探讨其自适应查询执行(AQE)和动态分区裁剪(DPP)等智能化特性,这些特性能够自动优化执行计划,有效应对数据倾斜问题,并结合Kryo序列化等性能优化手段

weixin_31412781的博客 255
上一篇: 一、Spark RDD及内存计算
下一篇: Spark3 新特性之DPP
Shyllin
博客等级 码龄10年 131粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值