微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spark3自适应查询计划Adaptive Query Execution,AQE

动态合并shuffle分区(Dynamically coalescing shuffle partitions)
动态调整join策略(Dynamically switching join strategies)
动态优化数据倾斜join(Dynamically optimizing skew joins)
参数:spark.sql.adaptive.enabled 关闭,开启此参数后上述三种策略才会执行

在这里插入图片描述

1、动态优化数据倾斜(Dynamically optimizing skew joins)
spark.sql.adaptive.skewJoin.enabled 认 true

相关参数:
①、spark.sql.adaptive.skewJoin.skewedPartitionFactor 认5
倾斜分区数据大小 > 整个RDD分区分区大小的中位数 * 此参数配置的值

在这里插入图片描述

②、spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes 认256MB
倾斜分区数据大小 > 此参数的认值

在这里插入图片描述

同时满足①、②这两个条件参会判定此分区倾斜需要进行裁剪
③、spark.sql.adaptive.advisoryPartitionSizeInBytes 认64MB
优化后的分区大小 = max(此参数, 非数据倾斜partition的平均大小)

在这里插入图片描述

在Reduce阶段进行自动倾斜处理的拆分操作,在同一个Executor内部,本该由一个Task处理的大分区,被AQE拆成多个小分区并交由多个Task去计算,这样可以解决Task之间的负载均衡。但解决不了不同Excuter之间的负载均衡。如果倾斜的分区都分到了一个Executor上,那么这个Executor的计算能力还是整个作业的瓶颈。
如果左右两边的表都出现了数据倾斜现象,需要对左右两张表的倾斜分区都进行拆分操作,左表拆分M各分区,右表拆分N各分区,那么每张表最终需要保证M*N个分区才能保证逻辑关联的一致性。所以在极端情况下对拆分的分区拉取、复制所需要的开销会不可控。
2、动态合并shuffle分区(Dynamically coalescing shuffle partitions)
spark.sql.adaptive.coalescepartitions.enabled 认 true

优化类型:物理计划 CoalesceShufflePartitions
统计信息:每个Reduce Task分区大小

发生在Shuffle Map完成后的Reduce阶段,Reduce Task将数据分片全部拉回,AQE按照分区编号的顺序,依次把小于目标尺寸的分区合并到一起。目标分区尺寸由一下两个参数决定
spark.sql.adaptive.advisoryPartitionSizeInBytes,认64M。
spark.sql.adaptive.coalescepartitions.minPartitionNum,最小分区数,认spark集群的认并行度。
最终的targetSize为:首先计算出总的shuffle的数据大小totalPostShuffleInputSize;
maxTargetSize为max(totalPostShuffleInputSize/minPartitionNum,16);targetSize=min(maxTargetSize,advisoryPartitionSizeInBytes)

3、动态调整join策略(Dynamically switching join strategies)
spark.sql.adaptive.localShuffleReader.enabled 认true

优化类型:逻辑计划 DemotebroadcastHashJoin
物理计划 OptimizeLocalShuffleReader
统计信息:Map阶段中间文件总大小、中间文件文件占比

DemotebroadcastHashJoin:把Shuffle Joins降级为broadcast Joins。仅适用于Shuffle Sort Merge Join。当两张表完成Shuffle Map阶段后,会继续判断某一张表是否满足一下两个条件
中间文件尺寸总和小于广播阈值 spark.sql.autobroadcastJoinThreshold(10M)
文件占比小于配置项 spark.sql.adaptive.nonEmptyPartitionRatioForbroadcastJoin(0.2)
只要有一个表满足就会降级

OptimizeLocalShuffleReader:因为AQE依赖的统计信息来自于Shuffle Map阶段生成的中间文件,所以在AQE开始优化前,Shuffle操作已经执行过半。
两张大表join,超过了广播阈值的话Spark sql最初会选择SortMerge Join,AQE只有结合两个表join中的Exchange才能进行降级判断,所以两张表必须都完成Map且中间文件落盘。AQE才会决定是否降级以及用那张表做广播变量
spark.sql.adaptive.localShuffleReader.enabled(true)完成省去Shuffle常规操作中的网络分发,Reduce Task可以就读取本地节点(local)的中间文件,完成与广播小表的关联操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐