¿Cuáles son las transformaciones de la chispa que causan un Shuffle?

Tengo problemas para encontrar en la documentación de Spark las operaciones que causan una reproducción aleatoria y una operación que no lo hace. En esta lista, ¿cuáles causan una confusión y cuáles no?

Mapa y filtro no lo hace. Sin embargo, no estoy seguro con los demás.

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) 

En realidad, es extremadamente fácil averiguarlo, sin la documentación. Para cualquiera de estas funciones, simplemente cree un RDD y llame a la cadena de depuración, aquí hay un ejemplo que puede hacer el rest por su cuenta.

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

Así que como puedes ver distinct crea un barajar. También es particularmente importante averiguar de esta manera en lugar de documentos, porque hay situaciones en las que se requerirá o no una orden aleatoria para una función determinada. Por ejemplo, unirse normalmente requiere un orden aleatorio, pero si se une a dos RDD, esa twig de la misma chispa RDD a veces puede eliminar el orden aleatorio.

Aquí hay una lista de operaciones que pueden causar una barajada:

cogroup

groupWith

join : partición hash

leftOuterJoin : partición hash

rightOuterJoin : partición hash

groupByKey : partición hash

reduceByKey : partición hash

combineByKey : partición hash

sortByKey : partición de rango

distinct

intersection : partición hash

repartition

coalesce

Fuente: Big Data Analysis con Spark y Scala , Optimización con particiones, Coursera

Esto podría ser útil: https://spark.apache.org/docs/latest/programming-guide.html#shuffle-operations

o esto: http://www.slideshare.net/SparkSummit/dev-ops-training , comenzando con la diapositiva 208

de la diapositiva 209: “Las transformaciones que usan ‘numParticiones’ como distintas probablemente se barajarán”

Aquí está la statement generalizada sobre barajar transformaciones.

Las transformaciones que pueden causar un orden aleatorio incluyen operaciones de reparto como repartition y coalesce , Operaciones ByKey (excepto para contar) como groupByKey y reduceByKey , y operaciones de combinación como cogroup y join .

fuente