我正在使用spark,我看到当查询有很多连接操作时,并且需要通过spark进行大量的shuffle操作。我正在寻找信息,为什么会发生这种情况,但我没有找到具体的内容。你能帮助解决这个问题吗?
答案 0 :(得分:3)
简单来说:
数据分布在各地。
有时,数据必须移动。
join
)组合两个RDD,或者想要一起收集键的所有值并对它们执行操作时,就是这种情况({{1} })。需要旅行的数据量可能并不总是很多。对于您的具体情况:
用于连接,如果RDD是co-partitioned,或者如果我们确保具有相同键的行位于一起,则在此期间不会有任何随机播放加入!
您可以通过转换为reduceByKey
来减少在groupByKey
操作中混洗的数据量。但是,这不是灵丹妙药,有些情况下您可能希望留在groupByKey
。
答案 1 :(得分:2)
Spark shuffle只是在群集中移动数据。因此,需要在分区中本地不存在的数据的转换将执行随机播放。查看连接,每个分区需要遍历整个连接的df以完成操作,因此进行了一次shuffle,它基本上将连接的df移动到每个活动分区。按键分组也会发生同样的事情,其中所有相同的键需要在同一个分区中结束,因此shuffle会将它们移动到那里。正如你所看到的,这不是很好的性能,所以如果可能你应该尽量避免它。