我试图运行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()方法中遗漏一些东西,其代码已经描述,但剩下的是什么?我没有看到作业配置需要进一步的信息。
感谢,
答案 0 :(得分:3)
尝试将@override
添加到reduce函数以确保它实际上覆盖了该行为。如果您的签名不匹配,那么它将使用默认的reduce,它什么都不做。如果你没有正确覆盖,你将收到编译器错误。
@override
reduce(Text key, Iterable<Text> values, Context context){
.......
context.write("v",NullWritable.get());
}