web-dev-qa-db-ja.com

共同パーティション化されたRDDを結合すると、Apache Sparkでシャッフルが発生しますか?

rdd1.join(rdd2)は、rdd1およびrdd2同じパーティショナーがありますか?

23
zwb

いいえ。2つの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)
    }
  }
}

ただし、シャッフルがなくても、ノード間でデータを移動する必要がないという意味ではありません。 2つのRDDが同じパーティショナーを持っている(共同パーティション化されている)が、対応するパーティションが異なるノードにある(同じ場所に配置されていない)可能性があります。

この状況は、シャッフルするよりも優れていますが、覚えておく必要があります。コロケーションはパフォーマンスを向上させることができますが、保証することは困難です。

38
Daniel Darabos