Time for action – fixing WordCount to work with a combiner
Let's make the necessary modifications to WordCount to correctly use a combiner.
Copy WordCount2.java
to a new file called WordCount3.java
and change the reduce
method as follows:
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int total = 0 ; for (IntWritable val : values)) { total+= val.get() ; } context.write(key, new IntWritable(total)); }
Remember to also change the class name to WordCount3
and then compile, create the JAR file, and run the job as before.
What just happened?
The output is now as expected. Any map-side invocations of the combiner performs successfully and the reducer correctly produces the overall output value.
Tip
Would this have worked if the original reducer was used as the combiner and the new reduce implementation as the reducer? The answer is no, though our test example would not have demonstrated it. Because...