没有调用Hadoop reducer

没有调用Hadoop reducer,hadoop,mapreduce,Hadoop,Mapreduce,全部 我有简单的map/reduce实现。Mapper被调用,它完成了它的工作,但reducer从未被调用 这是mapper: static public class InteractionMap extends Mapper<LongWritable, Text, Text, InteractionWritable> { @Override protected void map(LongWritable offset, Text text, Context con

全部

我有简单的map/reduce实现。Mapper被调用,它完成了它的工作,但reducer从未被调用

这是mapper:

static public class InteractionMap extends Mapper<LongWritable, Text, Text, InteractionWritable> {

    @Override
    protected void map(LongWritable offset, Text text, Context context) throws IOException, InterruptedException {
        System.out.println("mapper");
        String[] tokens = text.toString().split(",");
        for (int idx = 0; idx < tokens.length; idx++) {
            String sourceUser = tokens[1];
            String targetUser = tokens[2];
            int points = Integer.parseInt(tokens[4]);
            context.write(new Text(sourceUser), new InteractionWritable(targetUser, points));
            }
        }
    }
}
有人知道为什么不调用reducer吗

  • 我希望
    Mapper
    方法中的
    text
    包含一些数据
  • 您是否真的需要
    减速机
    作为
    组合器
    以及
    减速机
  • 我总是有一个主类
    InteractionMapReduce
    ,其中有
    InteractionMap
    InteractionReduce

    因此,在作业中设置
    Mapper
    Reducer
    类时,我将它们设置为
    InteractionMapReduce.InteractionMap.class
    InteractionMapReduce.InteractionReduce.class


    我不知道这是否对你有帮助,但你可以试试。

    好的,正如所料,这是我的错。作业配置不好。 它应该是这样的:

    Configuration configuration = getConf();
    
    Job job = new Job(configuration, "Interaction Count");
    job.setJarByClass(InteractionMapReduce.class);
    job.setMapperClass(InteractionMap.class);
    job.setReducerClass(InteractionReduce.class);
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(InteractionWritable.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
    return job.waitForCompletion(true) ? 0 : -1;
    
    出现此问题是因为map和reduce阶段具有不同的输出类型。调用context.write方法后,作业以静默方式失败。因此,我必须补充以下几行:

    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(InteractionWritable.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    

    1.是的。输入数据大约有1000行csv文本。2.我不知道,但将其作为组合器移除并不能解决问题。看到了吗。Reducer签名没有问题,我用api docs.Oops检查了它。很抱歉InteractionWritable是一个映射。我没有注意到。删除第三点。更新了我的答案。你能分享你的map、combiner和reducer输入/输出计数计数器吗?
    Configuration configuration = getConf();
    
    Job job = new Job(configuration, "Interaction Count");
    job.setJarByClass(InteractionMapReduce.class);
    job.setMapperClass(InteractionMap.class);
    job.setReducerClass(InteractionReduce.class);
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(InteractionWritable.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
    return job.waitForCompletion(true) ? 0 : -1;
    
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(InteractionWritable.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);