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

rdlzhqv9  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(360)

我使用spark,我看到当一个查询有很多连接操作,而groupbyspark需要做很多洗牌操作时。我想知道为什么会发生这种情况,但我没有找到任何具体的信息。你能帮我理解这个吗?

67up9zun

67up9zun1#

spark shuffles只是在集群中移动数据。因此,任何需要分区中本地不存在的数据的转换都将执行洗牌。在join方面,每个分区都需要遍历整个连接的df以完成操作,因此执行了一次洗牌,基本上将连接的df移动到每个活动分区。同样的事情也会发生在groupby键上,所有相同的键都需要在同一个分区中结束,所以洗牌会将它们移到那里。正如您所看到的,这在性能方面不是很好,因此您应该尽可能避免它。

r1wp621o

r1wp621o2#

简单地说:
这些数据分布在各处。
spark运行在分布式文件系统之上,比如hdfs。因为它是一个分布式文件系统,所以数据分布在集群中。
rdd是分布式数据集的抽象,因此构成rdd的数据分布在集群中。
有时,数据必须四处移动。
每当您遇到一个操作时,需要将具有相同键的行放在一起,请担心。
因为它是一个分布式文件系统,所以具有相同密钥的行需要在集群中移动(无序排列)才能在一起。例如,当您希望按键组合两个RDD时,就是这种情况( join ),或者当您希望收集一个键的所有值并对其执行操作时( groupByKey ).
需要传输的数据量可能并不总是很多。针对您的具体情况:
对于连接,如果RDD是共分区的,或者如果我们已经确保具有相同键的行放在一起,那么在连接过程中不会出现任何混乱!
您可以减少在一个数据库中乱序的数据量 groupByKey 切换到的操作 reduceByKey . 然而,这并不是什么灵丹妙药,有些情况下你可能会想继续坚持下去 groupByKey .

相关问题