我需要不断获取映射器和 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");
}