Несколько союзов в Spark — как Spark генерирует план

У меня есть несколько объединений в последовательности в разных RDD, как показано ниже:

val result = rdd1 union rdd2 union rdd3 union rdd4

Будет ли Spark генерировать объединения последовательно (что равно O(n)), или Spark будет генерировать параллельный план (O(log(n))? То есть будет ли он выполнять rdd1 union rdd2 параллельно с rdd3 union rdd4, а затем объединять результаты этих двух ?


person Sumit Pal    schedule 23.09.2015    source источник


Ответы (2)


Вы можете использовать rdd1.union(rdd2) для объединения двух RDD. В этом случае новый UnionRDD создается для каждой пары соединенных СДР. В качестве альтернативы вы можете использовать sc.union(Seq(rdd1, rdd2)) для одновременного объединения более двух RDD. В этом случае создается только один UnionRDD независимо от того, сколько RDD объединено.

Объединение RDD очень просто: оно просто ставит разделы одного RDD после разделов другого. Поскольку фактические вычисления происходят в разделах, время выполнения операции с объединением СДР такое же, как время, которое потребовалось бы для работы с СДР без объединения. Поэтому стоимость объединения можно вообще не учитывать.

person Daniel Darabos    schedule 23.09.2015
comment
Возможно, стоит упомянуть, что rdd1.union(rdd2) не запускает никаких вычислений. Преобразования RDD ленивы. Они влияют только на то, как будут разворачиваться вычисления, когда они в конечном итоге инициируются вычислением. Другое дело, что партиции всегда обрабатываются параллельно, по одной на ядро ​​исполнителя. Таким образом, вы берете объединение 100 RDD с 1 разделом в каждом (используя любой метод), если у вас есть 100 ядер, результатом будут все задачи, обрабатываемые параллельно. Ни O(n), ни O(log(n)). - person Daniel Darabos; 24.09.2015

Визуализация объединения:
если у вас есть 4 RDD, каждый из которых состоит из 4 разделов.

Разделы RDD разделены на несколько ядер

после .union у вас будет один RDD, состоящий из 16 разделов.

введите здесь описание изображения

Перетасовка не выполняется в union. Это просто изменение бухгалтерии. Это чрезвычайно эффективно. Его следует использовать везде, где это возможно (например, вместо OR в критерии join).

person ZygD    schedule 22.06.2021