为什么join和group by会影响spark中的数据shuffle量

jUs*_*Usr 6 hadoop apache-spark

我使用 Spark 并且发现当查询有很多连接操作并且 group by Spark 需要执行大量洗牌操作时。我一直在寻找为什么会发生这种情况的信息,但我没有找到具体的信息。你能帮助理解这一点吗?

小智 5

Spark shuffle 只是在集群中移动数据。因此,任何需要分区本地不存在的数据的转换都会执行洗牌。查看 join,每个分区都需要遍历整个连接的 df 才能完成操作,因此会进行洗牌,基本上将连接的 df 移动到每个活动分区。同样的情况也会发生在按键分组时,所有相同的键都需要位于同一个分区中,以便随机播放将它们移动到那里。正如您所看到的,这在性能方面并不是很好,因此您应该尽可能避免它。


axi*_*iom 5

用更简单的话来说:

  1. 数据分散。

    • Spark 运行在分布式文件系统(例如 HDFS)之上。由于它是一个分布式文件系统,因此数据分布在整个集群中。
    • RDD是分布式数据集的抽象,因此构成RDD的数据分布在集群中。
  2. 有时,数据必须四处移动。

    • 每当您遇到需要将具有相同键的行放在一起的操作时,请务必担心。
    • 由于它是一个分布式文件系统,具有相同键的行需要穿过集群(随机排列)才能聚集在一起。例如,当您想要通过键 ( join) 组合两个 RDD 时,或者当您想要将某个键的所有值收集在一起并对它们执行操作 ( groupByKey) 时,就会出现这种情况。
  3. 需要传输的数据量可能并不总是很多。针对您的具体情况:

    • 对于连接,如果 RDD 是共同分区的,或者如果我们确保具有相同键的行坐在一起,则在连接期间不会有任何洗牌!

    • groupByKey您可以通过转移到 来减少操作中混洗的数据量reduceByKey。然而,这并不是灵丹妙药,在某些情况下您可能想继续使用groupByKey