1

Hadoop 0.20 API に基づく Hadoop in Action book の Map Reduce プログラミング例を試していたときに、エラーが発生しました。

java.io.IOException: マップからの値の型の不一致: 予想される org.apache.hadoop.io.IntWritable、受信した org.apache.hadoop.io.Text

しかし、私がチェックした限り、私はすべてを適切に渡しています。誰かがこれで私を助けてくれれば本当に助かります。

これがコードです。その本にあるのと同じコードです。

@SuppressWarnings("unused")
public class CountPatents extends Configured implements Tool {
    @SuppressWarnings("deprecation")

    public static class MapClass extends MapReduceBase implements Mapper<Text, Text, Text, Text> {
        public void map(Text key, Text value,OutputCollector<Text, Text> output,Reporter reporter) throws IOException {
            output.collect(value, key);
        }
    }
public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, IntWritable> {
    public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
        int count=0;
        while(values.hasNext()){
            count=count+1;

            values.next();

        }


        output.collect(key, new IntWritable(count));
    }
}


    public int run(String[] args) throws Exception {

    Configuration conf = getConf();
    JobConf job = new JobConf(conf, CountPatents.class);
    Path in = new Path(args[0]);
    Path out = new Path(args[1]);
    FileInputFormat.setInputPaths(job, in);
    FileOutputFormat.setOutputPath(job, out);
    job.setJobName("MyJob");
    job.setMapperClass(MapClass.class);
    job.setReducerClass(Reduce.class);
    job.setInputFormat(KeyValueTextInputFormat.class);
    job.setOutputFormat(TextOutputFormat.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    job.set("key.value.separator.in.input.line", ",");
    JobClient.runJob(job);
    return 0;
    }
    public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new Configuration(), new CountPatents(), args);
        System.exit(res);


    }

    }
4

6 に答える 6

8

簡単に見ると(コードをローカルで実行していない)、設定時にジョブの出力をTextタイプに設定しているように見えますがjob.setOutputValueClass(Text.class);、レデューサーの出力タイプはIntWritableに設定されています。それはおそらくエラーです。

于 2011-03-23T23:48:24.730 に答える
0

マップが < Text,Text > を出力

そう設定

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

setMapOutputKeyClass setMapOutputValueClass

于 2013-12-05T18:53:30.030 に答える
0

レデューサーからの出力にエラーが含まれているはずです。

resuce クラスの定義は次のとおりです。

public static class Reduce を継承 MapReduceBase を実装する Reducer

したがって、出力値は IntWritable 型である必要があります。

ただし、 job.setOutputValueClass(Text.class); について言及しました。

したがって、構成に従って、レデューサーの出力はテキストである必要があります。

解決策: 構成で、次の行を追加します job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class);

および変更: job.setOutputValueClass(IntWritable.class);

次に、実行してみてください

于 2013-03-18T09:16:01.887 に答える
0

不在着信:

job.setMapOutputValueClass(IntWritable.class);

JobConf の代わりに、新しい 0.20 インターフェイスと新しい「Job」オブジェクトを使用しても同じ問題が発生します。

于 2011-05-31T18:07:29.370 に答える