MapReduce输出键按升序排列

时间:2015-05-29 11:23:46

标签: java sorting hadoop mapreduce

我编写了一个MapReduce代码,其中键和值都是整数。我正在使用单个Reducer。输出是这样的:

Key    Value
1      78
128    12
174    26
2      44
2957   123
975    91

是否有一种方法可以按键按升序对输出进行排序?这样输出看起来像这样:

1      78
2      44
128    12
174    26
975    91
2957   123

我需要使用conf.setComparator吗?如果是,我该怎么做?

3 个答案:

答案 0 :(得分:8)

这需要

  

TotalOrderPartitioner

     

https://hadoop.apache.org/docs/r2.4.1/api/org/apache/hadoop/mapreduce/lib/partition/TotalOrderPartitioner.html

在M / R管道中强制执行一个额外的阶段,将元素划分为已分类的存储桶。

TreeMap解决方案不会全局工作,只能在每个Reducer中使用。

以下是显示如何使用TotalOrderPartioner的要点(不是我的):https://gist.github.com/asimjalis/e5627dc2ff2b23dac70b

要点的关键要点是:

a)你需要调用reducer.setPartitionerClass到TotalOrderPartitioner:

  // Use Total Order Partitioner.
  reduceJob.setPartitionerClass(TotalOrderPartitioner.class);

b)您需要生成一组拆分以用作"桶"对于TOP

  // Generate partition file from map-only job's output.
  TotalOrderPartitioner.setPartitionFile(
      reduceJob.getConfiguration(), partitionPath);
  InputSampler.writePartitionFile(reduceJob, new InputSampler.RandomSampler(
      1, 10000));

答案 1 :(得分:4)

我在这里看到三个选项:

  1. (并且首选)使用the answer of javadba(来自我的+1)。这更通用,但需要更多努力。

  2. 如果可以,只需使用一个减速机。这要求所有数据都可以放入单个机器的内存中。然后,单个减速器的输入将按键的升序排序(您想要的)。

  3. 作业完成后,您可以使用hdfs的getmerge命令,然后手动对合并文件进行排序,例如,使用the sort command of Linux(甚至对多个文件进行合并排序,没有getmerge命令。毕竟,你不必为所有事情使用MapReduce! 小心只根据键进行排序!例如,您可以运行:

    sort -n -k1,1 filename
    

    但是还有更多的排序选项......

  4. 作为最后的注释(完成)以上所有假设您不使用仅映射作业,其中输出未排序。如果是这样,我只能看到选项3工作。

    更新:为了将来参考并根据评论,输出键似乎不是IntWritable类型,因此它们没有按整数排序。

答案 2 :(得分:0)

使用TreeMap。它是为此而创建的:

  

基于红黑树的NavigableMap实现。 地图根据其键的自然顺序进行排序,或者在地图创建时提供的比较器进行排序,具体取决于使用的构造函数。