方法一:
- 每个map任务对自己的输入数据进行排序,但是无法做到全局排序,需要将数据传递到reduce,然后通过reduce进行一次总的排序,但是这样做的要求是只有一个reduce任务来完成。
- 并行度不高,无法发挥分布式计算的特点。
方法二:
- 使用多个partition对map的结果进行分区,且分区后的结果是有区间的,将多个分区结果拼接起来,就是一个连续的全局排序文件。
- hadoop自带的Partitioner的实现有两种,一种为HashPartitioner,默认的分区方式,另一种为TotalOrderPartitioner,为排序作业创建分区,分区中数据的范围要通过分区文件来指定。
- 分区文件可以认为指定,如采用等距区间,如果数据分布不均匀导致作业完成时间受限于个别reduce任务完成的时间的影响。
- 也可以通过抽样器,先对数据进行抽样,根据分布生成分区文件,避免数据倾斜。
参考文章