2015-10-01 43 views
6

Załóżmy, że mam listę ciągów znaków. Filtruję je i zbieram wynik do sterownika. Jednak rzeczy są dystrybuowane, a każdy RDD ma swoją własną część oryginalnej listy. W jaki sposób Spark osiąga ostateczną uporządkowaną kolejność, czy łączy wyniki?W jaki sposób Spark osiąga kolejność sortowania?

Odpowiedz

3

sortowanie iskrowej wielofazowym procesem, który wymaga tasowanie:

  1. wejście RDD jest próbkowany i próbka ta jest wykorzystywana do obliczania granic dla każdej strefy wyjścia (sample następnie collect)
  2. wejście RDD wymieszano stosując rangePartitioner z granicami obliczone w etapie pierwszym (partitionBy)
  3. każda strefa z drugiego etapu są sortowane lokalnie (mapPartitions)

Po zebraniu danych pozostaje pozostawienie porządku określonego przez partycjonera.

Powyższe kroki są wyraźnie widoczne w ciąg debugowania:

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 
Powiązane problemy