【问题标题】:MapReduce - How sort reduce output by valueMapReduce - 如何按值排序减少输出
【发布时间】:2012-09-09 22:23:23
【问题描述】:

如何按值对减速器输出进行降序排序? 我正在开发一个必须返回热门歌曲的应用程序。因此歌曲必须按收听次数排序。 我的应用程序以这种方式工作:

Input: songname@userid@boolean
MapOutput : songname userid
ReduceOutput : songname number_of_listening

知道怎么做吗?

【问题讨论】:

标签: sorting hadoop mapreduce


【解决方案1】:

最好的方法是使用第一个 MapReduce 作业的输出作为另一个作业的输入,我称之为 Sort.java。由于 Hadoop Map 函数具有适当的排序算法,因此您甚至不需要 reduce 类。只需执行以下操作:

public static class Map extends Mapper<LongWritable,Text,IntWritable,Text>{
   private Text word = new Text();
   public void map(LongWritable key, Text value, Context context) throws IO Exception, Interrupted Exception{
   String line = value.toString();
   StringTokenizer tokenizer = new StringTokenizer(line);
   word.set(tokenizer.nextToken());
   IntWritable number = new IntWritable(Integer.parseInt(tokenizer.nextToken()));
   context.write(number,word);
   }     
}

这将按 LongWritable 值对您的第一个 MapReduce 的 [LongWritable,text] 输出进行排序。告诉我它是如何工作的!

CL

【讨论】:

  • 来自 Hadoop 2.4.0 的 Mapper 类 javadoc:“如果作业的 reduce 为零,则 Mapper 的输出直接写入 OutputFormat,无需按键排序。”这不就说明你的答案实际上是错误的吗?
【解决方案2】:

根据the docs,Reducer 输出不会重新排序。通过为 JobConf.setOutputValueGroupingComparator(Class) 设置适当的值对减速器的输入进行排序(如果这适用于您的应用程序),或者在单独的步骤中对减速器的最终输出进行排序。

【讨论】:

  • 感谢您的回答,对减速器的输入值进行排序并不能解决我的问题。有一种方法可以启动两个工作,将第一个的输出作为第二个的输入?
  • @highlycaffeinated 是正确的。在配置映射器和缩减器的 MR 类中,只需配置并提交第二个作业,该作业指向第一个作业的输出作为第二个作业的输入。请务必使用 submitAndWait 而不是仅提交。
  • 谢谢克里斯。我该怎么做?我必须从 shell 运行这两项工作(一个接一个),或者有一种方法可以同时启动这两个工作?我看到 Job API link 并且没有任何方法可以获取预先固定的输入。抱歉,这是我第一次使用 hadoop。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
相关资源
最近更新 更多