为什么我使用Mapreduce时会出现混乱的结果

时间:2014-05-19 03:36:06

标签: java hadoop mapreduce

我认为我的代码一定有些错误,但我无法找到它。

在我的课程中,我有:

public static class BrowserMapper extends
        Mapper<LongWritable, Text, Text, IntWritable>

public static class BrowserReduce extends
        Reducer<Text, IntWritable, IntWritable, Text> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values,
            Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        result.set(sum);
        context.write(result, key);
    }
}

我的工作配置如下:

public int run(String[] args) throws Exception {
    Job job = Job.getInstance();

    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(IntWritable.class);

    job.setOutputKeyClass(IntWritable.class);
    job.setOutputValueClass(Text.class);

    job.setMapperClass(BrowserMapper.class);
    job.setReducerClass(BrowserReduce.class);

    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);

    FileInputFormat.setInputPaths(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    job.setJarByClass(LogAnalysis.class);

    job.waitForCompletion(true);

    return 0;
}

当我开始这份工作时,我得到了这样的结果:

175394  IE
1475014 chrome
508390  firefox
23566   opera
421729  other
1266627 safari

但预期结果如下:

1475014 chrome
1266627 safari
508390  firefox
421729  other
175394  IE
23566   opera

任何想法?非常感谢

2 个答案:

答案 0 :(得分:1)

结果按发送给Reducer的密钥排序(例如,IE,chrome ...)。您是否注意到第二列按字母顺序排序?

如果要按总和计数对它们进行排序,则需要添加另一个MapReduce步骤并将计数设置为键。

答案 1 :(得分:1)

创建私有实例变量

TreeMap sortedMap = new TreeMap();

而不是做context.write(result,key);在Reducer中,将这些值存储在TreeMap中。 sortedMap.put(sum,key);

在清理方法中,您可以按照您希望的输出方式执行context.write()。 TreeMap对输出进行排序。所以你将实现你想要的。