在Hadoop中我们可以在map / reduce任务中增加计数器,它看起来像这样:
...
context.getCounter(MyCountersEnum.SomeCounter).increment(1);
...
你可以在日志中找到它们的价值。
如何在作业完成后从代码中访问它们?
什么是Hadoop API来读取计数器值?
答案 0 :(得分:5)
计数器代表全局计数器,由Map-Reduce框架或应用程序定义。
每个计数器可以是任何枚举类型。 您可以将计数器定义为Driver类
中的枚举static enum UpdateCount{
CNT
}
然后在map / reduce任务中增加计数器
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);
}
}
并在Driver class
中访问它们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();
//Print "c"
}
}
c 给出计数器值。
您可以找到示例here
答案 1 :(得分:3)
我刚刚找到答案here。
您需要一个作业对象来访问计数器:
Counters counters = job.getCounters();
Counter counter = counters.findCounter(MyCountersEnum.SomeCounter);
System.out.println(counter.getDisplayName() + ": " + counter.getValue());