自适应查询执行

自适应查询执行(AQE)是发生在查询执行查询重新优化。

运行时重新优化的动机是砖最新的准确的统计数据的洗牌和广播交换(称为AQE查询阶段)。因此,砖可以选择更好的物理策略,选择最优post-shuffle分区大小和数目,或做优化,用于需要提示,例如,斜加入处理。

时,这可能是非常有用的统计信息收集统计时不打开或失效。也有用在静态导出统计数据是不准确的地方,例如在一个复杂的查询,或者发生后的数据倾斜。

功能

在砖运行时7.3 LTS以上,AQE默认情况下是启用的。它有4个主要特点:

  • 排序合并连接到广播哈希连接动态变化。

  • 动态合并分区(结合小分区合理大小的分区)洗牌后交流。非常小的任务更糟糕的I / O吞吐量和更容易遭受来自调度开销和任务设置开销。结合小任务节约资源和提高集群的吞吐量。

  • 动态处理斜排序合并连接和洗牌哈希连接的分裂和复制(如果需要)倾斜任务为大致均匀大小的任务。

  • 动态检测和传播空的关系。

应用程序

AQE适用于所有查询:

  • 的非

  • 包含至少一个交易所(通常当有一个连接、聚集或窗口),子查询,或两者兼而有之。

并不是所有AQE-applied必然是优化查询。重新优化可能或不可能想出一个比一个静态编译不同的查询计划。确定查询的计划已经改变了AQE,看到下面的部分,查询计划

查询计划

本节讨论如何以不同的方式查看查询计划。

火花UI

AdaptiveSparkPlan节点

包含一个或多个AQE-applied查询AdaptiveSparkPlan节点,通常每个主查询的根节点或子查询。在查询运行之前或者当它运行时,isFinalPlan相应的旗AdaptiveSparkPlan节点显示为;在查询执行完成后,isFinalPlan标志的变化真实的。

发展计划

查询执行进度计划图的演变,反映了最新的计划正在执行的。节点已经被执行(指标)不会改变,但是那些没有可以改变随着时间的推移重新优化的结果。

下面是一个查询计划图的例子:

查询计划图

DataFrame.explain ()

AdaptiveSparkPlan节点

包含一个或多个AQE-applied查询AdaptiveSparkPlan节点,通常每个主查询的根节点或子查询。在查询运行之前或者当它运行时,isFinalPlan相应的旗AdaptiveSparkPlan节点显示为;在查询执行完成后,isFinalPlan标志的变化真正的

当前和初步计划

在每个AdaptiveSparkPlan节点会有最初的计划(该计划在应用任何AQE优化)和当前或最后的计划,取决于执行完成。当前的计划执行进度会进化。

运行时统计数据

每个洗牌和广播阶段包含统计数据。

前阶段运行或运行阶段时,统计数据是编译时估计,国旗isRuntime,例如:统计(sizeInBytes = 1024.0简约,rowCount = 4,isRuntime = false);

执行阶段完成后,在运行时统计数据是收集和旗帜isRuntime将成为真正的,例如:统计(sizeInBytes = 658.1简约,rowCount = 2.81 e + 4,isRuntime = true)

下面是一个DataFrame.explain例子:

  • 在执行之前

    在执行之前
  • 执行期间

    在执行期间
  • 后执行

    后执行

SQL解释

AdaptiveSparkPlan节点

通常包含一个或多个AdaptiveSparkPlan AQE-applied查询节点,每个主查询的根节点或子查询。

目前没有计划

作为SQL解释不执行查询,目前的计划总是一样的最初计划,并不能反映最终被AQE执行。

下面是一个SQL解释的例子:

SQL解释

有效性

查询计划将会改变,如果一个或多个AQE优化生效。这些AQE优化的效果之间的差异,证明了电流和最终的计划和初始计划和具体计划在当前节点和最终的计划。

  • 动态改变排序合并连接到广播哈希连接:不同的物理连接节点之间的电流/最终计划和最初的计划

    加入战略字符串
  • 动态合并分区:节点CustomShuffleReader有财产合并

    自定义洗牌读者
    自定义洗牌读者字符串
  • 动态处理斜加入:节点SortMergeJoin与字段isSkew是真实的。

    倾斜连接计划
    倾斜连接字符串
  • 动态检测和传播空关系:部分(或全部)的计划取而代之的是节点LocalTableScan关系字段为空。

    当地表扫描
    当地表扫描字符串

配置

启用和禁用自适应查询执行

财产

spark.databricks.optimizer.adaptive.enabled

类型:布尔

是否启用或禁用自适应查询执行。

默认值:真正的

动态改变排序合并连接到广播哈希连接

财产

spark.databricks.adaptive.autoBroadcastJoinThreshold

类型:字节字符串

阈值触发切换到广播在运行时加入。

默认值:30 mb

动态合并分区

财产

spark.sql.adaptive.coalescePartitions.enabled

类型:布尔

是否启用或禁用分区合并。

默认值:真正的

spark.sql.adaptive.advisoryPartitionSizeInBytes

类型:字节字符串

合并后的目标尺寸。合并分区大小将接近但不超过这一目标的大小。

默认值:64 mb

spark.sql.adaptive.coalescePartitions.minPartitionSize

类型:字节字符串

合并后分区的最小大小。合并分区大小不会比这个尺寸小。

默认值:1 mb

spark.sql.adaptive.coalescePartitions.minPartitionNum

类型:整数

合并后的最小数量的分区。不推荐,因为设置显式重写spark.sql.adaptive.coalescePartitions.minPartitionSize

默认值:2 x。集群的核心

动态处理斜加入

财产

spark.sql.adaptive.skewJoin.enabled

类型:布尔

是否启用或禁用斜加入处理。

默认值:真正的

spark.sql.adaptive.skewJoin.skewedPartitionFactor

类型:整数

一个因素,当乘以平均分区大小有助于确定一个分区是否倾斜。

默认值:5

spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes

类型:字节字符串

一个阈值,有助于确定一个分区是否倾斜。

默认值:256 mb

一个分区是当两个倾斜(分区大小>skewedPartitionFactor*中位数分区大小)(分区大小>skewedPartitionThresholdInBytes)真正的

动态检测和空的传播关系

财产

spark.databricks.adaptive.emptyRelationPropagation.enabled

类型:布尔

是否启用或禁用动态空关系传播。

默认值:真正的

常见问题(FAQ)

AQE为什么不改变洗牌分区号尽管分区合并已经启用了吗?

AQE不会改变最初的分区号。建议您设置一个合理的高价值的洗牌分区号,让AQE合并小分区基于查询的输出数据的大小在每个阶段。

如果你看到洒在你的工作,你可以试试:

  • 增加了洗牌分区号配置:spark.sql.shuffle.partitions

  • 启用自动洗牌通过设置进行了优化spark.databricks.adaptive.autoOptimizeShuffle.enabled真正的

为什么不AQE广播一个连接表?

如果将广播的大小关系是否属于这个阈值但还没有广播:

  • 检查连接类型。播放不支持特定的连接类型,例如,左边的关系加入不能播放。

  • 它也可以包含很多空分区的关系,在这种情况下,能够迅速完成大多数任务的排序合并连接或与斜加入可以优化处理。AQE避免改变这样的排序合并连接广播散列连接的比例低于非空分区spark.sql.adaptive.nonEmptyPartitionRatioForBroadcastJoin

我还是应该使用广播提示启用了AQE加入策略吗?

是的。静态计划广播加入通常比动态规划一个更好的性能由AQE AQE才会切换到广播加入执行洗牌后双方的加入(的时间)获得的实际大小的关系。所以使用广播提示仍然可以是一个不错的选择如果你知道你的查询。AQE会尊重查询提示一样的静态优化,但是仍然可以应用动态优化不受暗示的影响。

之间的区别是什么斜加入提示和AQE倾斜连接优化吗?我应该使用哪一个?

建议依靠AQE倾斜连接处理,而不是使用倾斜连接提示,因为AQE倾斜连接是完全自动的,一般执行比提示。

AQE调整我为什么不加入自动订购吗?

的动态加入重新排序不属于AQE砖LTS 7.3运行时。

为什么不AQE检测我的数据倾斜?

有两个尺寸必须满足条件AQE检测一个分区作为一个倾斜的分区:

  • 分区大小大于spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes(默认256 mb)

  • 中等大小的分区大小大于所有分区倍倾斜分区的因素spark.sql.adaptive.skewJoin.skewedPartitionFactor(默认5)

此外,斜处理支持某些连接类型是有限的,例如,在加入,只有斜左侧可以优化。

遗产

执行“适应性”这个词已经存在自1.6火花,但新AQE引发3.0是完全不同的。在功能方面,火花1.6只有“动态合并分区”部分。在技术架构方面,新AQE框架的动态规划和重新规划的查询基于运行时统计数据,支持多种优化等我们在本文中所描述的和可以扩展,使更多的潜在优化。