Spark的排序原理

    就比较新的Spark来说,题主要找的 RDD 层面的 sortByKey() 实现在Spark的 shuffle 当中的。

    sortByKey() 采用的是tera-sort风格的实现,其自身包含一个使用range partitioning的shuffle操作。

Stage 0:Sample。创建 RangePartitioner,先对输入的数据的key做sampling来估算key的分布情况,然后按指定的排序切分出range,尽可能让每个partition对应的range里的key的数量均匀。计算出来的 rangeBounds 是一个长为 numPartitions - 1 的Array[TKey],记录前 numPartitions - 1 个partition对应的range的上界;最后一个partition的边界就隐含在“剩余”当中。 Stage 1:Shuffle Write。开始shuffle,在map side做shuffle write, 每个计算节点(“map side”)根据前面计算出的rangeBounds对输入的数据做重新分片(repartition),分片采用 range partitioning 使得重新分片后的数据自然在分片之间是排好序的,而此时每个分片内的数据并不一定排好序了Stage 2:Shuffle Read。然后到reduce side,每个reducer再对拿到的本partition内的数据做排序。

    这样完成之后,partition之间的数据在map side就保证有排序,而每个partition内的数据在reduce side也保证有排序,就达到了全局排序的效果。

    简易图如下:

Spark的排序原理_第1张图片

你可能感兴趣的:(Spark)