我想了解计数器如何在Hadoop中运行..
我尝试在作业期间使用Context设置计数器,并在以后从TaskReport读取它。 我的目标是检索缩减器在上下文中放置的最大计数器值 我的代码如下所示:
public void launchJob(Configuration conf) {
beforeJob(conf); // setup configuration
Job job = Job.getInstance(conf, "jobName");
job.setJarByClass(Class.forName("jarClass"));
boolean result = job.waitForCompletion(true);
afterJob(result);
}
private long afterJob(Job job) {
JobClient client = new JobClient(job.getConfiguration());
JobID jobId = new JobID(job
.getJobID().getJtIdentifier(), job.getJobID().getId());
List<Long> allTaskCounts = new ArrayList<Long>();
for (TaskReport reduceCounters : client.getReduceTaskReports(jobId)) {
Counters taskCounters = reduceCounters.getTaskCounters();
Counter taskCounter = taskCounters.findCounter(MyEnum.KEY);
allTaskCounts.add(taskCounter.getValue());
}
return Collections.max(allTaskCounts);
}
在我的工作的减少阶段,我设置了上下文计数器:
protected void reduce(..., Context context) {
long myCounter = doSomeCalculation();
context.getCounter(MyEnum.KEY).setValue(myCounter);
//...
}
当我在我的&#34; afterJob&#34;中获得任务计数器时,我希望在减少阶段看到我在上下文中放置的值。方法,但我得到不同的价值 在reduce阶段中每次放入上下文都会产生一个值~100但是当我尝试使用任务计数器将它们恢复时,我会得到非常低的值,小于10。
我想我错过了一些关于这些计数器如何在Hadoop中运行的内容 我希望有人能帮助我理解这个......