Spark的排序原理

本文介绍了Spark中sortByKey()函数的排序原理,该方法通过range partitioning的shuffle操作,在RDD层面上实现数据的预排序,确保map阶段后每个partition内部有序,再在reduce阶段保证全局排序。

    就比较新的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也保证有排序,就达到了全局排序的效果。

    简易图如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值