我需要不断获取映射器和 reducer 的运行时间。我已经提交了以下工作。

 JobClient jobclient = new JobClient(conf);
 RunningJob runjob = jobclient.submitJob(conf);


 TaskReport [] maps = jobclient.getMapTaskReports(runjob.getID());

 long mapDuration = 0;
 for(TaskReport rpt: maps){
    mapDuration += rpt.getFinishTime() - rpt.getStartTime();
 }

但是,当我运行程序时,似乎未提交作业,并且映射器从未启动。如何使用JobClient.runJob(conf)并且仍然能够获得运行时间?

最佳答案

submitJob()方法可立即将控制权返回给调用程序,而无需等待hadoop作业开始,因为作业不那么完整。如果要等待,请使用waitForCompletion()方法,该方法仅在hadoop作业完成后才返回。我想您需要介于两者之间的内容,因为您想在提交之后但在完成之前运行后续代码。

我建议您将后续代码放入一个循环,直到工作完成为止(使用isComplete()方法进行该测试),并随着工作的进行观察映射器和化简器。您可能也想将Thread.sleep(xxx)放入循环中的某个位置。

要回复您的评论,您想...

job.waitForCompletion();
TaskCompletionEvent event[] = job.getTaskCompletionEvents();
for (int i = 0; i < event.length(); i++) {
    System.out.println("Task "+i+" took "+event[i].getTaskRunTime()+" ms");
}

10-07 15:55