我使用spark,我看到当一个查询有很多连接操作,而groupbyspark需要做很多洗牌操作时。我想知道为什么会发生这种情况,但我没有找到任何具体的信息。你能帮我理解这个吗?
67up9zun1#
spark shuffles只是在集群中移动数据。因此,任何需要分区中本地不存在的数据的转换都将执行洗牌。在join方面,每个分区都需要遍历整个连接的df以完成操作,因此执行了一次洗牌,基本上将连接的df移动到每个活动分区。同样的事情也会发生在groupby键上,所有相同的键都需要在同一个分区中结束,所以洗牌会将它们移到那里。正如您所看到的,这在性能方面不是很好,因此您应该尽可能避免它。
r1wp621o2#
简单地说:这些数据分布在各处。spark运行在分布式文件系统之上,比如hdfs。因为它是一个分布式文件系统,所以数据分布在集群中。rdd是分布式数据集的抽象,因此构成rdd的数据分布在集群中。有时,数据必须四处移动。每当您遇到一个操作时,需要将具有相同键的行放在一起,请担心。因为它是一个分布式文件系统,所以具有相同密钥的行需要在集群中移动(无序排列)才能在一起。例如,当您希望按键组合两个RDD时,就是这种情况( join ),或者当您希望收集一个键的所有值并对其执行操作时( groupByKey ).需要传输的数据量可能并不总是很多。针对您的具体情况:对于连接,如果RDD是共分区的,或者如果我们已经确保具有相同键的行放在一起,那么在连接过程中不会出现任何混乱!您可以减少在一个数据库中乱序的数据量 groupByKey 切换到的操作 reduceByKey . 然而,这并不是什么灵丹妙药,有些情况下你可能会想继续坚持下去 groupByKey .
join
groupByKey
reduceByKey
2条答案
按热度按时间67up9zun1#
spark shuffles只是在集群中移动数据。因此,任何需要分区中本地不存在的数据的转换都将执行洗牌。在join方面,每个分区都需要遍历整个连接的df以完成操作,因此执行了一次洗牌,基本上将连接的df移动到每个活动分区。同样的事情也会发生在groupby键上,所有相同的键都需要在同一个分区中结束,所以洗牌会将它们移到那里。正如您所看到的,这在性能方面不是很好,因此您应该尽可能避免它。
r1wp621o2#
简单地说:
这些数据分布在各处。
spark运行在分布式文件系统之上,比如hdfs。因为它是一个分布式文件系统,所以数据分布在集群中。
rdd是分布式数据集的抽象,因此构成rdd的数据分布在集群中。
有时,数据必须四处移动。
每当您遇到一个操作时,需要将具有相同键的行放在一起,请担心。
因为它是一个分布式文件系统,所以具有相同密钥的行需要在集群中移动(无序排列)才能在一起。例如,当您希望按键组合两个RDD时,就是这种情况(
join
),或者当您希望收集一个键的所有值并对其执行操作时(groupByKey
).需要传输的数据量可能并不总是很多。针对您的具体情况:
对于连接,如果RDD是共分区的,或者如果我们已经确保具有相同键的行放在一起,那么在连接过程中不会出现任何混乱!
您可以减少在一个数据库中乱序的数据量
groupByKey
切换到的操作reduceByKey
. 然而,这并不是什么灵丹妙药,有些情况下你可能会想继续坚持下去groupByKey
.