I'm incrementing a counter from the mappers in the following way
public static class TokenizerMapper
extends Mapper<Object, Text, Text, FloatWritable>{
public static enum MyCounters { TOTAL };
context.getCounter(MyCounters.TOTAL).increment(1);
.
I'm trying to get the value of this counter in the reducer class in the following way.
@Override
public void setup(Context context) throws IOException ,InterruptedException{
Configuration conf = context.getConfiguration();
Cluster cluster = new Cluster(conf);
Job currentJob = cluster.getJob(context.getJobID());
Counters counters = currentJob.getCounters();
Counter counter = counters.findCounter(TokenizerMapper.MyCounters.TOTAL);
But when I run the code ,
it always gives a
java.lang.NullPointerException at the last line
cluster.getJob(context.getJobID())
which always returns null.
I've tried other ways to access a counter incremented within the mapper in the reducer , but with no success .
Can someone please explain to me what the problem is exactly and how can I access the counters from the reducer . I need the value of the total count to calculate the percentage of the words.
This is my driver code.
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(FloatWritable.class);
job.setNumReduceTasks(1);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);