apache-spark - spark中的spark.shuffle.partition和spark.repartition有什么区别?

标签 apache-spark bigdata apache-spark-sql-repartition spark-shuffle

我的理解是 当我们重新分区值为 n 的任何数据帧时,数据将继续保留在这 n 个分区上,直到您达到任何随机播放阶段或重新分区或合并的其他值。 对于 Shuffle,它仅在您达到任何洗牌阶段时才会发挥作用,并且数据将继续保留在这些分区上,直到您达到合并或重新分区为止。 我是对的 ? 如果是,那么有人能指出一个显着的区别吗?

最佳答案

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

我假设你在谈论配置属性 spark.sql.shuffle.partitions和方法.repartition .

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

与此相反,spark.sql.shuffle.partitions是一个配置属性,它控制在由于聚合和连接等操作而发生数据移动时创建的分区数。

Configures the number of partitions to use when shuffling data for joins or aggregations.

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

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

基本上-

  • 加入/聚合导致改组,从而导致重新分区
  • 要求重新分区,必须进行洗牌

另一种方法 coalesce使差异更明显。

For reference, coalesce is a variant of repartition which can only lower the number of partitions, not necessarily equal in size. As it already knows the number of partitions are only to be decreased, it can perform it with minimal shuffling (just join two adjacent partitions until the number is met).

考虑到您的数据框有 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 的分区数

关于apache-spark - spark中的spark.shuffle.partition和spark.repartition有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74750713/

相关文章:

hadoop - 在 HIVE 中执行 INSERT INTO SELECT 语句时会创建空零件文件

haskell - 使用惰性文本和字节字符串处理非常大的文本文件

postgresql - 我应该迁移到 Redshift 吗?

apache-spark - 可以合并增加Spark DataFrame的分区

python - 如何使用 Python 在 Spark 中执行两个 RDD 表的基本连接?

apache-spark - Spark Streaming 连续作业

scala - 如何在 Play 框架的生产模式中包含文件

java - 已解决 Java Spark 中缺少属性 newvalue#10