Какие преобразования Spark вызывают Shuffle?

У меня проблемы с поиском в документации по Spark операций, вызывающих случайное перемешивание, а операций - нет. В этом списке, какие из них вызывают случайные изменения, а какие нет?

Карта и фильтр нет. Однако я не уверен с другими.

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)

4 ответа

Решение

Это на самом деле очень легко выяснить, без документации. Для любой из этих функций просто создайте RDD и вызовите строку отладки, вот один пример, который вы можете сделать все остальное самостоятельно.

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)

Итак, как вы можете видеть distinct создает перемешивание Кроме того, особенно важно выяснить этот способ, а не документы, потому что существуют ситуации, когда для определенной функции потребуется или не требуется перемешивание. Например, для соединения обычно требуется случайное перемешивание, но если вы присоединяетесь к двум RDD, эта ветвь от одной и той же искры RDD может иногда исключать случайное перемешивание.

Вот список операций, которые могут вызвать случайное перемешивание:

cogroup

groupWith

join: хеш раздел

leftOuterJoin: хеш раздел

rightOuterJoin: хеш раздел

groupByKey: хеш раздел

reduceByKey: хеш раздел

combineByKey: хеш раздел

sortByKey: раздел диапазона

distinct

intersection: хеш раздел

repartition

coalesce

Источник: Анализ больших данных с помощью Spark и Scala, Оптимизация с помощью разделов, Coursera

Это может быть полезно: https://spark.apache.org/docs/latest/programming-guide.html

или это: http://www.slideshare.net/SparkSummit/dev-ops-training, начиная со слайда 208

из слайда 209: "Преобразования, которые используют" numPartitions "как отдельные, вероятно, будут перемешиваться"

Вот обобщенное утверждение о тасующих преобразованиях.

Преобразования, которые могут вызвать перемешивание, включают в себя такие операции перераспределения, как repartition а также coalesce, 'ByKey операции (кроме подсчета), как groupByKey а также reduceByKeyи присоединиться к таким операциям, как cogroup а также join,

источник

Другие вопросы по тегам