ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-25 19:02:30  阅读:344  来源: 互联网

标签:Shuffle Spark3 分区 默认 AQE sql Query spark adaptive


动态合并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)的中间文件,完成与广播小表的关联操作。

标签:Shuffle,Spark3,分区,默认,AQE,sql,Query,spark,adaptive
来源: https://blog.csdn.net/weixin_45162906/article/details/119085791

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有