2014-10-09 15 views
24

Mam problem ze znalezieniem w dokumentacji dokumentacji Spark, która powoduje przetasowanie i operację, która tego nie robi. Na tej liście, które z nich powodują przetasowanie, a które nie?Jakie są transformacje Spark powodujące Shuffle?

Mapa i filtr nie. Jednak nie jestem pewien z innymi.

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) 

Odpowiedz

29

W rzeczywistości bardzo łatwo jest znaleźć to, bez dokumentacji. W przypadku dowolnej z tych funkcji wystarczy utworzyć RDD i wywołać ciąg debugowania, tutaj jest jeden przykład, aby zrobić resztę na własną rękę.

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) 

Tak więc, jak widać, distinct tworzy przetasowanie. Jest również szczególnie ważne, aby dowiedzieć się w ten sposób, a nie dokumenty, ponieważ istnieją sytuacje, w których przetasowania będą wymagane lub nie są wymagane do określonej funkcji. Na przykład sprzężenie zwykle wymaga shuffle, ale jeśli dołączysz dwa RDD, gałąź z tej samej iskry RDD może czasami wymusić przetasowanie.

+6

To tylko ogólnie dobry punkt o programowaniu faktycznie - starają się odpowiedzieć na pytania, czytając kod i przy użyciu kodu nad dokumentacją czytania. Dokumentacja może często zawierać powielanie informacji, a wraz z duplikacją pojawiają się błędy i utrata informacji. Czytając kod, można dokładnie wiedzieć * co się dzieje :) – samthebest

+0

Zgodnie z dokumentacją 'toDebugString' zwraca" Opis tego RDD i jego rekurencyjnych zależności dla debugowania. " Więc będzie zawierać możliwe przetasowania z wcześniejszych transformacji, jeśli istnieją, nawet jeśli ostatnia transformacja nie powoduje shuffle, prawda? –

0

Oto uogólnione stwierdzenie na przemian tasowania.

transformacji, które mogą powodować shuffle obejmują Répartition operacji jak repartition i coalesce, „ByKey operacji (oprócz zliczania) jak groupByKey i reduceByKey i przyłączenia operacje jak cogroup i join.

source