如何通过api访问hadoop计数器值?

nsc4cvqm  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(328)

在hadoop中,我们可以在map/reduce任务中增加counter,如下所示:

...
context.getCounter(MyCountersEnum.SomeCounter).increment(1);
...

你可以在日志中找到它们的价值。
作业完成后如何从代码访问它们?
什么是hadoopapi来读取计数器值?

2vuwiymt

2vuwiymt1#

我在这里找到了答案。
需要作业对象才能访问计数器:

Counters counters = job.getCounters();
Counter counter = counters.findCounter(MyCountersEnum.SomeCounter);
System.out.println(counter.getDisplayName() + ": " + counter.getValue());
t2a7ltrp

t2a7ltrp2#

计数器表示全局计数器,由map reduce框架或应用程序定义。
每个计数器可以是任何枚举类型。您可以将计数器定义为驱动程序类中的枚举

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);
 }
}

并在驱动程序类中访问它们

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给出计数器值。
你可以在这里找到一个例子

相关问题