Spark如何实现排序顺序?

时间:2015-10-01 12:27:05

标签: sorting apache-spark

假设我有一个字符串列表。我过滤&对它们进行排序,并将结果收集到驱动程序中然而,事物是分布式的,每个RDD都有自己原始列表的一部分。那么,Spark如何实现最终的排序顺序,它是否合并了结果?

1 个答案:

答案 0 :(得分:19)

Spark中的排序是一个需要改组的多阶段过程:

  1. 对RDD进行采样,此示例用于计算每个输出分区的边界(sample后跟collect
  2. 输入RDD使用rangePartitioner进行分区,并在第一步计算边界(partitionBy
  3. 第二步中的每个分区都在本地排序(mapPartitions
  4. 收集数据时,剩下的就是遵循分区程序定义的顺序。

    以上步骤清楚地反映在调试字符串中:

    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