在hadoop中,我们可以在map/reduce任务中增加counter,如下所示:
... context.getCounter(MyCountersEnum.SomeCounter).increment(1); ...
你可以在日志中找到它们的价值。作业完成后如何从代码访问它们?什么是hadoopapi来读取计数器值?
2vuwiymt1#
我在这里找到了答案。需要作业对象才能访问计数器:
Counters counters = job.getCounters(); Counter counter = counters.findCounter(MyCountersEnum.SomeCounter); System.out.println(counter.getDisplayName() + ": " + counter.getValue());
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给出计数器值。你可以在这里找到一个例子
2条答案
按热度按时间2vuwiymt1#
我在这里找到了答案。
需要作业对象才能访问计数器:
t2a7ltrp2#
计数器表示全局计数器,由map reduce框架或应用程序定义。
每个计数器可以是任何枚举类型。您可以将计数器定义为驱动程序类中的枚举
然后在map/reduce任务中增加计数器
并在驱动程序类中访问它们
c给出计数器值。
你可以在这里找到一个例子