spark.shuffle.partition与spark.shuffle.partition的区别是什么?在spark



我所理解的是当我们重新分区任何值为n的数据框时,数据将继续保留在这n个分区上,直到您达到任意shuffle阶段或重分区或合并的其他值。对于Shuffle,它只在您达到任意Shuffle阶段时才会发挥作用,并且数据将继续保留在这些分区上,直到您达到合并或重新分区。我说的对吗?如果是,那么谁能指出一个显著的区别呢?

TLDR -根据开发人员的需要调用重分区,但在有逻辑需求时进行shuffle

我想你说的是配置属性spark.sql.shuffle.partitions和方法.repartition

由于数据分布在任何分布式环境中都是一个重要方面,它不仅控制并行性,而且如果分布不均匀也会产生不利影响。然而,重新分区本身是一个昂贵的操作,因为它涉及大量的数据移动(即改组)。.repartition方法用于显式将数据重新分区到新的分区中-这意味着根据您的需要增加或减少程序中的分区数量。你可以随时调用它。

与此相反,spark.sql.shuffle.partitions是一个配置属性,用于管理由于聚合和连接等操作导致数据移动时创建的分区数量。

配置数据转移时使用的分区数连接或聚合。

当您执行连接或聚合以外的转换时,上述配置不会对新Dataframe将具有的分区数量产生任何影响。

您对两者的混淆是由于两个操作都涉及洗牌。虽然这是正确的,但前者(即重分区)是一种显式操作,其中用户指示框架增加或减少分区的数量-这反过来会导致改组,而在连接/聚合的情况下-改组是由操作本身引起的。

基本上

  • 连接/聚合导致改组,从而导致重分区
  • 请求
  • 重分区,因此必须进行改组

另一种方法coalesce使差异更清楚。

作为参考,coalesce是repartition的一种变体,它只能降低分区的数量,而不一定相等。因为它已经知道只需要减少分区的数量,所以它可以用最小的改组来执行它(只是连接两个相邻的分区,直到满足数量)。

考虑您的数据框架有4个分区,但其中只有2个分区中有数据,因此您决定将分区数量减少到2个。当使用coalesce时,spark尝试在不变换或最小化变换的情况下实现这一点。

df.rdd().getNumPartitions(); // Returns 4 with size 0, 0, 2, 4
df=df.coalesce(2);           // Decrease partitions to 2
df.rdd().getNumPartitions(); // Returns 2 now with size 2, 4

所以没有洗牌。而下面的

df1.rdd().getNumPartitions() // Returns 4
df2.rdd().getNumPartitions() // Returns 8
df1.join(df2).rdd().getNumPartitions() // Returns 200

当您执行连接时,它将始终返回基于spark.sql.shuffle.partitions

的分区数

最新更新