我试图运行WordCount示例的变体,变体是,Mapper输出Text作为key和Text作为value, reducer输出Text作为key和NullWritable作为value。
除了map、reduce签名之外,我把主要的方法写成这样:
//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函数设置为
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()方法中遗漏了一些东西,它的代码被描述了,但是剩下的是什么?我不知道Job配置还需要什么信息。
谢谢,
尝试将@override
添加到reduce函数中,以确保它实际上覆盖了该行为。如果您的签名不匹配,那么它将使用默认的reduce,它什么也不做。如果你没有正确地重写,你会得到一个编译器错误。
@override
reduce(Text key, Iterable<Text> values, Context context){
.......
context.write("v",NullWritable.get());
}