mapreduce按升序输出键

hwazgwia  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(279)

我编写了一个mapreduce代码,其中键和值都是整数。我用的是一个减速机。输出如下:

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 ? 如果是,我怎么做?

rta7y2nd

rta7y2nd1#

我在这里看到三种选择:
(首选)使用javadba的答案(+1来自我)。这是更一般的,但需要更多的努力。
如果可以,就用一个减速机。这就要求所有的数据都能放在一台机器的内存中。然后,单个reducer的输入将按键的升序(您想要的)排序。
作业完成后,您可以使用 getmerge 命令,然后手动排序合并的文件,例如使用 sort 命令(甚至合并排序多个文件,而不使用 getmerge 命令)。毕竟,你不必事事都使用mapreduce!请注意仅根据密钥进行排序!例如,您可以运行:

sort -n -k1,1 filename

但是还有很多排序选项。。。
作为最后一点(为了完成),以上所有内容都假设您不使用只Map的作业,在该作业中输出没有排序。如果是这样的话,我只能看到选项3起作用。
更新:为了将来的参考和基于注解,输出键似乎不是类型 IntWritable ,因此它们没有按整数排序。

8yoxcaq7

8yoxcaq72#

这需要一个

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) 您需要生成一组split,用作顶部的“bucket”

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

nkoocmlb3#

使用 TreeMap . 它是为此而创建的:
基于红黑树的navigablemap实现。Map根据其键的自然顺序进行排序,或者由Map创建时提供的比较器进行排序,具体取决于所使用的构造函数。

相关问题