Counters are a useful channel for gathering statistics about the job: for quality control or for application level-statistics.Lets see an example where Counters count the no of keys processed in reducer.
3 key points to set
1. Define counter in Driver class
public class CounterDriver extends Configured implements Tool{
long c = 0;
static enum UpdateCount{
CNT
}
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
int res = ToolRunner.run(conf, new CounterDriver(), args);
System.exit(res);
}
public int run(String[] args) throws Exception {
2. Increment or set counter in Reducer
public class CntReducer extends Reducer<IntWritable, Text, IntWritable, Text>{
public void reduce(IntWritable key,Iterable<Text> values,Context context) {
//do something
context.getCounter(UpdateCount.CNT).increment(1);
}
}
3. Get counter in Driver class
public class CounterDriver extends Configured implements Tool{
long c = 0;
static enum UpdateCount{
CNT
}
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
int res = ToolRunner.run(conf, new CounterDriver(), args);
System.exit(res);
}
public int run(String[] args) throws Exception {
.
.
.
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.setInputPaths(job,in );
FileOutputFormat.setOutputPath(job, out);
job.waitForCompletion(true);
c = job.getCounters().findCounter(UpdateCount.CNT).getValue();
}
}