联合分区的 RDD 是否会导致 Apache Spark 中的洗牌?
Does a join of co-partitioned RDDs cause a shuffle in Apache Spark?
如果 rdd1
和 rdd2
具有相同的分区程序,rdd1.join(rdd2)
会导致随机播放吗?
没有。如果两个 RDD 具有相同的分区程序,则 join
不会导致随机播放。你可以在 CoGroupedRDD.scala
:
中看到这个
override def getDependencies: Seq[Dependency[_]] = {
rdds.map { rdd: RDD[_ <: Product2[K, _]] =>
if (rdd.partitioner == Some(part)) {
logDebug("Adding one-to-one dependency with " + rdd)
new OneToOneDependency(rdd)
} else {
logDebug("Adding shuffle dependency with " + rdd)
new ShuffleDependency[K, Any, CoGroupCombiner](rdd, part, serializer)
}
}
}
但是请注意,没有随机播放并不意味着没有数据必须在节点之间移动。两个 RDD 可能具有相同的分区器(共分区),但相应的分区位于不同的节点上(不共存)。
这种情况仍然比随机播放要好,但需要牢记这一点。共置可以提高性能,但很难保证。
如果 rdd1
和 rdd2
具有相同的分区程序,rdd1.join(rdd2)
会导致随机播放吗?
没有。如果两个 RDD 具有相同的分区程序,则 join
不会导致随机播放。你可以在 CoGroupedRDD.scala
:
override def getDependencies: Seq[Dependency[_]] = {
rdds.map { rdd: RDD[_ <: Product2[K, _]] =>
if (rdd.partitioner == Some(part)) {
logDebug("Adding one-to-one dependency with " + rdd)
new OneToOneDependency(rdd)
} else {
logDebug("Adding shuffle dependency with " + rdd)
new ShuffleDependency[K, Any, CoGroupCombiner](rdd, part, serializer)
}
}
}
但是请注意,没有随机播放并不意味着没有数据必须在节点之间移动。两个 RDD 可能具有相同的分区器(共分区),但相应的分区位于不同的节点上(不共存)。
这种情况仍然比随机播放要好,但需要牢记这一点。共置可以提高性能,但很难保证。