Будет ли rdd1.join(rdd2)
вызывать перетасовку, если rdd1
и rdd2
имеют один и тот же разделитель?
Соединяется ли совместное разделение RDD в Shuffle в Apache Spark?
Ответ 1
Нет. Если два 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 имеют один и тот же разделитель (совместно разделяемый), но имеют соответствующие разделы, расположенные на разных узлах (не размещаются совместно).
Эта ситуация по-прежнему лучше, чем перетасовка, но это нужно иметь в виду. Совместное размещение может повысить производительность, но трудно гарантировать.