7

すべて

単純なmap/reduceの実装があります。マッパーが呼び出され、その役割を果たしますが、レデューサーは呼び出されません。

マッパーは次のとおりです。

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));
            }
        }
    }
}

これが私のレデューサーです:

static public class InteractionReduce extends Reducer<Text, InteractionWritable, Text, Text> {

    @Override
    protected void reduce(Text token, Iterable<InteractionWritable> counts, Context context) throws IOException, InterruptedException {
        System.out.println("REDUCER");
        Iterator<InteractionWritable> i = counts.iterator();
        while (i.hasNext()) {
            InteractionWritable interaction = i.next();
            context.write(token, new Text(token.toString() + " " + interaction.getTargetUser().toString() + " " + interaction.getPoints().get()));
        }
    }

}

そして、ここに構成部分があります:

@Override
public int run(String[] args) throws Exception {
    Configuration configuration = getConf();
    Job job = new Job(configuration, "Interaction Count");
    job.setJarByClass(InteractionMapReduce.class);
    job.setMapperClass(InteractionMap.class);
    job.setCombinerClass(InteractionReduce.class);
    job.setReducerClass(InteractionReduce.class);
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.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;
}

レデューサーが呼び出されない理由を誰かが知っていますか?

4

2 に答える 2

8

さて、予想通り、それは私のせいでした。仕事の構成は良くありませんでした。これはどのように見えるべきかです:

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);
于 2012-10-03T13:43:04.897 に答える
1
  1. textあなたのMapperメソッドにいくつかのデータがあることを願っています。
  2. あなたは本当にだけでなく、である必要がありますReducerか?CombinerReducer

私は常に1つのメインクラスInteractionMapReduceを持っており、その中にはInteractionMapInteractionReduceクラスがあります。

そのため、ジョブでとクラスを設定するときに、とのようにMapper設定します。ReducerInteractionMapReduce.InteractionMap.classInteractionMapReduce.InteractionReduce.class

これがあなたに役立つかどうかはわかりませんが、あなたはそれを試すことができます。

于 2012-10-01T15:51:03.580 に答える