web-dev-qa-db-fra.com

Quelles sont les transformations Spark qui provoquent un Shuffle?

J'ai du mal à trouver dans la documentation Spark des opérations qui provoquent un brassage et des opérations qui ne le font pas. Dans cette liste, lesquelles provoquent un remaniement et lesquelles ne provoquent pas? 

La carte et le filtre ne le font pas. Cependant, je ne suis pas sûr avec les autres.

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)
31
poiuytrez

En fait, il est extrêmement facile de le savoir, sans la documentation. Pour n’importe laquelle de ces fonctions, créez simplement un RDD et appelez la chaîne de débogage. En voici un exemple: vous pouvez faire le reste vous-même. 

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)

Comme vous pouvez le constater, distinct crée un mélange. Il est également particulièrement important de connaître cette méthode plutôt que de la documenter, car il existe des situations dans lesquelles un mélange aléatoire sera requis ou non requis pour une fonction donnée. Par exemple, rejoindre nécessite généralement un mélange, mais si vous joignez deux RDD, cette branche provenant de la même étincelle de RDD peut parfois éviter le mélange.

35
aaronman

Voici une liste des opérations qui pourraient provoquer un remaniement:

cogroup

groupWith

join : partition de hachage

leftOuterJoin : partition de hachage

rightOuterJoin : partition de hachage

groupByKey : partition de hachage

reduceByKey : partition de hachage

combineByKey : partition de hachage

sortByKey : partition partition

distinct

intersection : partition de hachage

repartition

coalesce

Source: Analyse de données volumineuses avec Spark et Scala , Optimisation avec des partitions, Coursera

8
ruhong

Cela pourrait être utile: https://spark.Apache.org/docs/latest/programming-guide.html#shuffle-operations

ou ceci: http://www.slideshare.net/SparkSummit/dev-ops-training , en commençant par la diapositive 208

de la diapositive 209: "Les transformations qui utilisent 'numPartitions' comme distinct vont probablement se mélanger"

3
Glenn Strycker

Voici la déclaration générale sur le remaniement des transformations.

Les transformations pouvant provoquer un mélange comprennent les opérations repartition comme repartition et coalesce, ‘opérations ByKey (sauf pour compter) comme groupByKey et reduceByKey, et join opérations comme cogroup et join.

la source

1
mrsrinivas