2015-02-08 3 views
15

Wird rdd1.join(rdd2) dazu führen, dass ein Shuffle auftritt, wenn rdd1 und den gleichen Partitionierer haben?Führt ein Join von gemeinsam partitionierten RDDs zu einem Shuffle in Apache Spark?

+3

Können Sie diese Frage umschreiben, um klarer zu sein? Nur weil RDDs Partitionen auf denselben Rechnern haben, heißt das nicht, dass sich alle Schlüssel immer auf derselben Partition befinden. Was fragst du dann? –

+1

Ich habe die Frage komplett umgeschrieben. Ich denke, es macht jetzt Sinn, aber ich bin mir nicht sicher, ob @zwb das meinte. Ich habe das Original nicht wirklich verstanden. Fühlen Sie sich frei, meine Bearbeitung wiederherzustellen und die Frage gegebenenfalls zu aktualisieren. –

+0

Danke, ich komme aus China und mein Englisch ist arm, ich kann mich nicht sehr klar ausdrücken und was du umgeschrieben hast, ist mein Sinn. – zwb

Antwort

28

Nein. Wenn zwei RDDs den gleichen Partitionierer haben, verursacht join keinen Shuffle. Sie können dies in CoGroupedRDD.scala sehen:

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) 
    } 
    } 
} 

ist jedoch zu beachten, dass das Fehlen eines Shuffle bedeutet nicht, dass keine Daten zwischen den Knoten bewegt werden müssen. Es ist möglich, dass zwei RDDs den gleichen Partitionierer haben (co-partitioniert), aber die entsprechenden Partitionen auf verschiedenen Knoten (nicht gemeinsam) liegen.

Diese Situation ist immer noch besser als ein Shuffle, aber es ist etwas zu beachten. Co-location kann die Leistung verbessern, ist jedoch schwer zu garantieren.

+0

Nochmals vielen Dank, ich im Grunde unstand und ich werde den Quellcode lesen, um mehr zu bekommen. – zwb

+0

Folgefrage: Gibt es Spark SQL-Implementierungen (einschließlich separater Projekte, die nicht in der Hauptdistribution enthalten sind), die die gemeinsame Partitionierung nutzen? – javadba

+0

@javadba: Es ist wahrscheinlich wert, in einer separaten Frage zu fragen. http://spark.apache.org/docs/latest/sql-programming-guide.html sagt über 'spark.sql.shuffle.partitions', dass es die Anzahl der Partitionen konfiguriert, die beim Mischen von Daten für Joins oder Aggregationen verwendet werden sollen . "Das ist also ein gutes Zeichen. –

Verwandte Themen