Apache Spark DAG 行为联合分组操作

Apache Spark DAG behaviour cogrouped operation

我想澄清一下 DAG 的行为,以及如何处理以下工作:

val rdd = sc.parallelize(List(1 to 10).flatMap(x=>x).zipWithIndex,3)
.partitionBy(new HashPartitioner(4))

val rdd1 = sc.parallelize(List(1 to 10).flatMap(x=>x).zipWithIndex,2)
.partitionBy(new HashPartitioner(3))

val rdd2 = rdd.join(rdd1)
rdd2.collect()

这是相关的rdd2.toDebugString

(4) MapPartitionsRDD[6] at join at IntegrationStatusJob.scala:92 []
 |  MapPartitionsRDD[5] at join at IntegrationStatusJob.scala:92 []
 |  CoGroupedRDD[4] at join at IntegrationStatusJob.scala:92 []
 |  ShuffledRDD[1] at partitionBy at IntegrationStatusJob.scala:90 []
 +-(3) ParallelCollectionRDD[0] at parallelize at IntegrationStatusJob.scala:90 []
 +-(3) ShuffledRDD[3] at partitionBy at IntegrationStatusJob.scala:91 []
    +-(2) ParallelCollectionRDD[2] at parallelize at IntegrationStatusJob.scala:91 []

这是火花 UI 图片:

查看 toDebugString 和 spark UI,如果我理解得很好,为了执行连接,DAG 会查看应该使用什么分区程序,因为两个 rdds 都是 HashPartitioned,它选择分区数较大的分区器,所以rdd个分区器。

现在从spark UI来看,好像rdd partitionByjoin是在同一个阶段执行的,所以在这个条件下,执行连接所需的洗牌,将仅从一侧完成吗?从一方面来说,我的意思是只有 rdd1 会被洗牌,两者都不会。

我的假设正确吗?

你说得对。如果两个 RDD 使用不同的分区程序进行分区,Spark 将选择一个作为参考,并仅修复/洗牌第二个。

如果两者具有相同的分区程序,则无需随机播放。