Mapreduce多reduce输出排序

在Mapreduce中,默认情况下多reduce输出是无序的,如果需要有序,可以使用两种方式:

  • 使用一个reduce,在内部实现排序
  • 使用多个reduce,实现全局排序

区别:

如果使用一个reduce实现排序,虽然可以实现排序,但失去了数据并行执行的优势;下面就实现多reduce输出,并实现全排序

实现步骤

  1. 设置分区器
//TODO 设置分区器为TotalOrderPartitioner
job.setPartitionerClass(TotalOrderPartitioner.class);
  1. 创建采样器
//TODO 创建采样器
InputSampler.Sampler sampler = new InputSampler.RandomSampler(0.1, 10000, 10);// 0.1为采样比例,10000为最大样本数,10为最大分区数
  1. 产生sequence文件,不需要自己调用采样器
//TODO 调用InputSampler的静态方法进行产生顺序文件,不需要自己调用采样器
InputSampler.writePartitionFile(job, sampler);
  1. 添加到分布式缓存
//TODO 添加到分布式缓存中
Configuration conf = job.getConfiguration();
String partitionFile = TotalOrderPartitioner.getParitionerFile(conf);
URI partitionUri = new URI(partitionFile + "#" + TotalOrderPartitioner.DEFAULT_PATH);
DistributedCache.addCacheFile(partitionUri, conf);
DistributedCache.createSymlink(conf);
  1. 执行job
//TODO 最后执行job
job.waitForCompletion(true);

在执行过程中,可以使用Job#setReduceTaskNum设置reduce的个数。

你可能感兴趣的:(Mapreduce多reduce输出排序)