1

私はWordCountの例のバリエーションを実行しようとしていました.バリエーションは、MapperがTextをキーとして出力し、Textを値として出力し、ReducerがTextをキーとして出力し、NullWritableを値として出力します。

マップに加えて、署名を減らし、メインメソッドを次のように配置します。

//start a conf
Configuration conf = new Configuration();
conf.set("str",str);

//initialize a job based on the conf
Job job = new Job(conf, "wordcount");
job.setJarByClass(org.myorg.WordCount.class);

//the reduce output
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);

//the map output
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);

//Map and Reduce
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);


//take hdfs locations as input and output
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

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

//run the job
job.waitForCompletion(true);

デバッグするには、マップ関数を次のように配置します

map(LongWritable key, Text value, Context context){
.........
context.write("1000000","2");
}

コードを次のように削減します

reduce(Text key, Iterable<Text> values, Context context){
 .......
 context.write("v",NullWritable.get());
}

ただし、出力で表示されるのはマップ出力だけです。レデューサーはコンパイルされますが、呼び出されません! コードが記述されている main() メソッドに何かが欠けている可能性があると思いますが、何が残っていますか? ジョブ構成にさらに必要な情報がわかりません。

ありがとう、

4

1 に答える 1

3

reduce 関数に追加@overrideして、実際に動作をオーバーライドしていることを確認してください。署名が一致しない場合は、何もしないデフォルトの reduce が使用されます。適切にオーバーライドしないと、コンパイラ エラーが発生します。

@override
reduce(Text key, Iterable<Text> values, Context context){
 .......
 context.write("v",NullWritable.get());
}
于 2013-06-15T11:32:19.553 に答える