2014-10-09 1 views
24

Ich habe Schwierigkeiten, in den Spark-Dokumentationsoperationen zu finden, die eine Zufallswiedergabe verursachen und die Operation nicht. Welche verursacht in dieser Liste einen Shuffle und welche nicht?Was sind die Spark-Transformationen, die einen Zufall verursachen?

Karte und Filter nicht. Bei den anderen bin ich mir jedoch nicht sicher.

map(func) 
filter(func) 
flatMap(func) 
mapPartitions(func) 
mapPartitionsWithIndex(func) 
sample(withReplacement, fraction, seed) 
union(otherDataset) 
intersection(otherDataset) 
distinct([numTasks])) 
groupByKey([numTasks]) 
reduceByKey(func, [numTasks]) 
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) 
sortByKey([ascending], [numTasks]) 
join(otherDataset, [numTasks]) 
cogroup(otherDataset, [numTasks]) 
cartesian(otherDataset) 
pipe(command, [envVars]) 
coalesce(numPartitions) 

Antwort

29

Es ist eigentlich extrem einfach, dies herauszufinden, ohne die Dokumentation. Für jede dieser Funktionen erstellen Sie einfach eine RDD und rufen Sie die Debug-Zeichenfolge, hier ist ein Beispiel können Sie den Rest auf ur eigene tun.

scala> val a = sc.parallelize(Array(1,2,3)).distinct 
scala> a.toDebugString 
MappedRDD[5] at distinct at <console>:12 (1 partitions) 
    MapPartitionsRDD[4] at distinct at <console>:12 (1 partitions) 
    **ShuffledRDD[3] at distinct at <console>:12 (1 partitions)** 
     MapPartitionsRDD[2] at distinct at <console>:12 (1 partitions) 
     MappedRDD[1] at distinct at <console>:12 (1 partitions) 
      ParallelCollectionRDD[0] at parallelize at <console>:12 (1 partitions) 

So wie Sie sehen können distinct erzeugt einen Shuffle. Es ist auch besonders wichtig, diesen Weg zu finden, anstatt Dokumente zu schreiben, da es Situationen gibt, in denen ein Mischen für eine bestimmte Funktion erforderlich oder nicht erforderlich ist. Zum Beispiel benötigt join normalerweise einen Shuffle, aber wenn Sie zwei RDDs beitreten, kann der Zweig vom selben RDD Funke manchmal den Shuffle ausgleichen.

+6

Es ist nur ein allgemein guter Punkt, um die Programmierung tatsächlich - versuchen, Fragen zu beantworten, indem Code zu lesen und über das Lesen der Dokumentation unter Verwendung von Code. Die Dokumentation kann häufig doppelte Informationen enthalten, und bei der Duplizierung kommt es zu Fehlern und zum Verlust von Informationen. Beim Lesen von Code kann man * genau * wissen, was vor sich geht :) – samthebest

+0

Laut der Dokumentation gibt 'toDebugString' eine Beschreibung dieser RDD und ihrer rekursiven Abhängigkeiten für das Debugging zurück. Es wird also mögliche Shuffle aus früheren Transformationen enthalten, wenn sie existieren, auch wenn bei der letzten Transformation kein Shuffle auftritt, oder? –

0

Hier ist die verallgemeinerte Aussage über schlurfende Transformationen.

Transformationen, die einen Shuffle umfassen repartition Operationen wie repartition und coalesce verursachen kann, ‚ByKey Operationen (mit Ausnahme für das Zählen) wie groupByKey und reduceByKey und verbinden Operationen wie cogroup und join.

source