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
partitionBy
和join
是在同一个阶段执行的,所以在这个条件下,执行连接所需的洗牌,将仅从一侧完成吗?从一方面来说,我的意思是只有 rdd1 会被洗牌,两者都不会。
我的假设正确吗?
你说得对。如果两个 RDD 使用不同的分区程序进行分区,Spark 将选择一个作为参考,并仅修复/洗牌第二个。
如果两者具有相同的分区程序,则无需随机播放。
我想澄清一下 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
partitionBy
和join
是在同一个阶段执行的,所以在这个条件下,执行连接所需的洗牌,将仅从一侧完成吗?从一方面来说,我的意思是只有 rdd1 会被洗牌,两者都不会。
我的假设正确吗?
你说得对。如果两个 RDD 使用不同的分区程序进行分区,Spark 将选择一个作为参考,并仅修复/洗牌第二个。
如果两者具有相同的分区程序,则无需随机播放。