当创建两个具有相同密钥集的不同Spark Pair RDD时,Spark是否会将具有相同密钥的分区分配给同一台机器?

When create two different Spark Pair RDD with same key set, will Spark distribute partition with same key to the same machine?

我想在两个非常大的键值对 RDD 之间进行连接操作。这两个 RDD 的键来自同一个集合。为了减少数据混洗,我希望我可以添加一个预分配阶段,以便具有相同密钥的分区将分布在同一台机器上。希望这可以减少一些随机播放时间。

我想知道 spark 是否足够聪明,可以为我做这件事,还是我必须自己实现这个逻辑?

我知道当我加入两个 RDD 时,一个使用 partitionBy 进行预处理。 Spark 足够聪明,可以使用这些信息并且只对其他 RDD 进行洗牌。但是我不知道如果我同时在两个RDD上使用partitionBy然后进行连接会发生什么。

如果您对两个 RDD 使用相同的分区程序,则可以实现数据集的共同分区。这并不一定意味着您的 RDD 位于同一位置——也就是说,分区数据位于同一节点上。

尽管如此,性能应该会更好,因为两个 RDD 都有不同的分区程序。

我看到了这个,Speeding Up Joins by Assigning a Known Partitioner 这将有助于理解对两个 RDD 使用相同的分区器的效果;

Speeding Up Joins by Assigning a Known Partitioner

If you have to do an operation before the join that requires a shuffle, such as aggregateByKey or reduceByKey, you can prevent the shuffle by adding a hash partitioner with the same number of partitions as an explicit argument to the first operation and persisting the RDD before the join.