Предположим, у меня есть список строк. Я фильтрую & сортирую их и собираю результат для водителя. Однако все распределяется, и каждый RDD имеет свою собственную часть исходного списка. Итак, как Spark достигает окончательного упорядоченного порядка, объединяет ли он результаты?Как Spark достигает порядка сортировки?
6
A
ответ
3
сортировки по Спарку является многофазным процессом, который требует перетасовка:
- вход РДД дискретизируется и этот образец используется для вычисления границ для каждого выходного раздела (
sample
с последующимcollect
) - входа РДД секционируются используя
rangePartitioner
с границами, вычисленных на первом этапе (partitionBy
) - каждый раздел на второй стадии сортируется локально (
mapPartitions
)
При сборе данных все, что осталось, это следовать порядку, определенному разделителем.
Вышеуказанные действия четко отражены в строке отладки:
scala> val rdd = sc.parallelize(Seq(4, 2, 5, 3, 1))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at ...
scala> rdd.sortBy(identity).toDebugString
res1: String =
(6) MapPartitionsRDD[10] at sortBy at <console>:24 [] // Sort partitions
| ShuffledRDD[9] at sortBy at <console>:24 [] // Shuffle
+-(8) MapPartitionsRDD[6] at sortBy at <console>:24 [] // Pre-shuffle steps
| ParallelCollectionRDD[0] at parallelize at <console>:21 [] // Parallelize