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

时间:2016-05-30 02:21:25

标签: hadoop apache-spark

我正在使用spark,我看到当查询有很多连接操作时,并且需要通过spark进行大量的shuffle操作。我正在寻找信息,为什么会发生这种情况,但我没有找到具体的内容。你能帮助解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

简单来说:

  1. 数据分布在各地。

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

    • 每当遇到具有相同密钥的行需要在一起的操作时,请担心。
    • 由于它是一个分布式文件系统,因此具有相同密钥的行需要穿过群集( shuffled )才能在一起。例如,当您想要通过键(join)组合两个RDD,或者想要一起收集键的所有值并对它们执行操作时,就是这种情况({{1} })。
  3. 需要旅行的数据量可能并不总是很多。对于您的具体情况:

    • 用于连接,如果RDD是co-partitioned,或者如果我们确保具有相同键的行位于一起,则在此期间不会有任何随机播放加入!

    • 您可以通过转换为reduceByKey来减少在groupByKey操作中混洗的数据量。但是,这不是灵丹妙药,有些情况下您可能希望留在groupByKey

答案 1 :(得分:2)

Spark shuffle只是在群集中移动数据。因此,需要在分区中本地不存在的数据的转换将执行随机播放。查看连接,每个分区需要遍历整个连接的df以完成操作,因此进行了一次shuffle,它基本上将连接的df移动到每个活动分区。按键分组也会发生同样的事情,其中​​所有相同的键需要在同一个分区中结束,因此shuffle会将它们移动到那里。正如你所看到的,这不是很好的性能,所以如果可能你应该尽量避免它。