为什么我在使用mapreduce的时候会得到一个无序的结果

sf6xfgos  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(383)

我想我的代码一定有问题,但我找不到。
在我的课程中,我有:

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

你知道吗?非常感谢

yx2lnoni

yx2lnoni1#

创建私有示例变量

TreeMap sortedMap = new TreeMap();

而不是做context.write(result,key);在reducer中,将这些值存储在treemap中。 sortedMap.put(sum,key); 在cleanup方法中,可以按您希望的方式执行context.write()。树Map对输出进行排序。所以你将实现你所期待的。

ecbunoof

ecbunoof2#

结果按发送到减速器的键排序(例如,chrome…)。你注意到第二列是按字母顺序排列的吗?
如果要按总和计数对它们进行排序,则需要添加另一个mapreduce步骤并将计数设置为键。

相关问题