我编写了一个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 ? 如果是,我怎么做?
conf.setComparator
rta7y2nd1#
我在这里看到三种选择:(首选)使用javadba的答案(+1来自我)。这是更一般的,但需要更多的努力。如果可以,就用一个减速机。这就要求所有的数据都能放在一台机器的内存中。然后,单个reducer的输入将按键的升序(您想要的)排序。作业完成后,您可以使用 getmerge 命令,然后手动排序合并的文件,例如使用 sort 命令(甚至合并排序多个文件,而不使用 getmerge 命令)。毕竟,你不必事事都使用mapreduce!请注意仅根据密钥进行排序!例如,您可以运行:
getmerge
sort
sort -n -k1,1 filename
但是还有很多排序选项。。。作为最后一点(为了完成),以上所有内容都假设您不使用只Map的作业,在该作业中输出没有排序。如果是这样的话,我只能看到选项3起作用。更新:为了将来的参考和基于注解,输出键似乎不是类型 IntWritable ,因此它们没有按整数排序。
IntWritable
8yoxcaq72#
这需要一个
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));
nkoocmlb3#
使用 TreeMap . 它是为此而创建的:基于红黑树的navigablemap实现。Map根据其键的自然顺序进行排序,或者由Map创建时提供的比较器进行排序,具体取决于所使用的构造函数。
TreeMap
3条答案
按热度按时间rta7y2nd1#
我在这里看到三种选择:
(首选)使用javadba的答案(+1来自我)。这是更一般的,但需要更多的努力。
如果可以,就用一个减速机。这就要求所有的数据都能放在一台机器的内存中。然后,单个reducer的输入将按键的升序(您想要的)排序。
作业完成后,您可以使用
getmerge
命令,然后手动排序合并的文件,例如使用sort
命令(甚至合并排序多个文件,而不使用getmerge
命令)。毕竟,你不必事事都使用mapreduce!请注意仅根据密钥进行排序!例如,您可以运行:但是还有很多排序选项。。。
作为最后一点(为了完成),以上所有内容都假设您不使用只Map的作业,在该作业中输出没有排序。如果是这样的话,我只能看到选项3起作用。
更新:为了将来的参考和基于注解,输出键似乎不是类型
IntWritable
,因此它们没有按整数排序。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:
b) 您需要生成一组split,用作顶部的“bucket”
nkoocmlb3#
使用
TreeMap
. 它是为此而创建的:基于红黑树的navigablemap实现。Map根据其键的自然顺序进行排序,或者由Map创建时提供的比较器进行排序,具体取决于所使用的构造函数。