完成工作后,Hadoop会获得由reducer编写的最大计数器

时间:2018-06-02 11:02:08

标签: java hadoop emr

我想了解计数器如何在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中运行的内容 我希望有人能帮助我理解这个......

0 个答案:

没有答案