【问题标题】:How does Spark decide the partitions number of the next stage when shuffle in SparkSQL?SparkSQL中shuffle时Spark如何决定下一阶段的分区数?
【发布时间】:2021-07-01 11:17:08
【问题描述】:

我当然知道spark.sql.shuffle.partitionsconfig,
但例如,当我在只有 200 行的小数据集上设置此配置 300 时,配置无效,实际分区号仅为 2,
另一个例子,我在有 300 亿行的数据集上设置了这个配置 3000,配置也无效,实际分区号只有 600,
我们看到,当我们在小数据集上设置大值分区配置时,配置将无效,
所以我只想知道在SparkSQL中shuffle时Spark如何决定下一阶段的分区数?或者如何强制此配置有效?
我的 Spark SQL 如下所示:

set spark.sql.shuffle.partitions=3000;
with base_data as (
select 
    device_id
from
   table_name
where
    dt = '20210621'
distribute by
    rand()
)
select count(1) from base_data

【问题讨论】:

标签: apache-spark apache-spark-sql


【解决方案1】:

一般来说,窄变换不会改变分区数。

宽变换变换不会改变分区数。

窄变换 在窄变换中,计算单个分区中的记录所需的所有元素都存在于父 RDD 的单个分区中。分区的有限子集用于计算结果。 map()、filter() 的结果是窄变换。

宽变换——在宽变换中,计算单个分区中的记录所需的所有元素可能存在于父 RDD 的许多分区中。分区可能存在于父 RDD 的许多分区中。宽变换是 groupbyKey 和 reducebyKey 的结果。

问题更改后更新:

您可以假设“spark.sql.shuffle.partitions”作为查询提示,在我看来,我们正在强制执行器为连接或聚合创建该数量的分区,除非我们非常确定,否则我们不应该使用这个值什么是分组键。

这将在网络上造成不必要的数据混洗。

【讨论】:

  • 我已经更新了我的答案,请再看一遍,谢谢
  • @Shawn.X 我添加了一个更新希望这能帮助你理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2016-06-19
相关资源
最近更新 更多