Соединяется ли совместное разделение RDD в Shuffle в Apache Spark?

Будет ли rdd1.join(rdd2) вызывать перетасовку, если rdd1 и rdd2 имеют один и тот же разделитель?

Ответ 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 имеют один и тот же разделитель (совместно разделяемый), но имеют соответствующие разделы, расположенные на разных узлах (не размещаются совместно).

Эта ситуация по-прежнему лучше, чем перетасовка, но это нужно иметь в виду. Совместное размещение может повысить производительность, но трудно гарантировать.