2015-10-01 6 views
6

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

ответ

3

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

  1. вход РДД дискретизируется и этот образец используется для вычисления границ для каждого выходного раздела (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