Каковы преобразования 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)
Ответы
Ответ 1
На самом деле очень легко найти это без документации. Для любой из этих функций просто создайте 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 может иногда ускользать в случайном порядке.
Ответ 2
Вот список операций, которые могут привести к тасованию:
cogroup
groupWith
join
: хэш-раздел
leftOuterJoin
: хэш-раздел
rightOuterJoin
: хэш-раздел
groupByKey
: хэш-раздел
reduceByKey
: хэш-раздел
combineByKey
: хэш-раздел
sortByKey
: диапазон разделов
distinct
intersection
: хэш-раздел
repartition
coalesce
Источник: Анализ больших данных с помощью Spark и Scala, оптимизация с помощью разделов, Coursera
Ответ 3
Это может быть полезно:
https://spark.apache.org/docs/latest/programming-guide.html#shuffle-operations
или это:
http://www.slideshare.net/SparkSummit/dev-ops-training, начиная с слайда 208
из слайда 209:
"Преобразования, которые используют" numPartitions "как разные, вероятно, будут перемешаны"
Ответ 4
Вот обобщенное утверждение о тасующих преобразованиях.
Преобразования, которые могут вызвать случайное перемешивание, включают в себя операции перераспределения, такие как repartition
и coalesce
, операции ByKey (кроме подсчета), такие как groupByKey
и reduceByKey
, и операции соединения, такие как cogroup
и join
.
источник