Как Spark достигает порядка сортировки?

Предположим, у меня есть список строк. Я фильтрую и сортирую их и собираю результат для драйвера. Однако все распределяется, и каждый RDD имеет свою собственную часть исходного списка. Итак, как Spark достигает окончательного упорядоченного порядка, объединяет ли он результаты?

Ответ 1

Сортировка в Spark - это многофазный процесс, который требует перемешивания:

  1. выборка входного RDD, и эта выборка используется для вычисления границ для каждого выходного раздела (sample, за которым следует collect)
  2. входной СДР разделяется с использованием rangePartitioner с границами, вычисленными на первом этапе (partitionBy)
  3. каждый раздел второго этапа сортируется локально (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