Какие преобразования 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
,