bounty还有6天到期。回答此问题可获得+300声望奖励。Rinat Veliakhmedov正在寻找典型答案。
我知道你可以设置spark.sql.shuffle.partitions
和spark.sql.adaptive.advisoryPartitionSizeInBytes
。前者不适用于自适应查询执行,而后者由于某种原因只适用于第一次 Shuffle ,之后它只使用默认的分区数量,即#核心。
有没有办法配置AQE来调整分区的数量,使每个分区不超过100MB?
bounty还有6天到期。回答此问题可获得+300声望奖励。Rinat Veliakhmedov正在寻找典型答案。
我知道你可以设置spark.sql.shuffle.partitions
和spark.sql.adaptive.advisoryPartitionSizeInBytes
。前者不适用于自适应查询执行,而后者由于某种原因只适用于第一次 Shuffle ,之后它只使用默认的分区数量,即#核心。
有没有办法配置AQE来调整分区的数量,使每个分区不超过100MB?
1条答案
按热度按时间z8dt9xmd1#
不确定您正在使用哪个版本的Spark,但您可以尝试将spark.sql.adaptive.coalescePartitions.minPartitionNum设置为某个值,开始时您可以尝试使用与sql.shuffle.partitions相同的值
我希望通过这个设置,你可以同时拥有这两种功能--小分区的自动合并+aqe对偏斜的处理,但是当有很多事情要做时,它会尝试从spark.sql.adaptive.coalescePartitions.minPartitionNum中保留最小数量的分区
目前,我还没有看到任何其他方法来强制spark动态计算它,以保持分区不大于100 mb。
为什么我认为它可能会改变一些事情:
以下是此参数的说明:
所以它是可选的,现在让我们检查它在哪里使用Spark代码:
看起来,当没有设置此参数并且spark.sql.adaptive.coalescePartitions.parallelismFirst设置为true(默认为true)时,Spark将选择默认并行度作为minPartitionNum。可能这就是您看到分区数量等于核心数量的原因
如果我理解正确的话,如果你设置spark.sql.adaptive.coalescePartitions.minPartitionNum,它应该可以做到这一点,并允许你对分区有更多的控制。
如果它没有帮助,或者您期望其他东西,您可以尝试使用其他sql.adaptive参数并检查它们在源代码中的使用情况。
我认为this blog post可能是一个很好的起点