我需要不断获得映射器和减速器的运行时间。我提交的工作如下。
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)
并仍然能够获得运行时间?
答案 0 :(得分:1)
submitJob()
方法立即将控制权返回给调用程序,而无需等待hadoop Job启动,更不用说完整了。如果要等待,请使用仅在hadoop作业完成后返回的waitForCompletion()
方法。我想你需要介于两者之间,因为你想在提交后但在完成之前运行后续代码。
我建议你把你的后续代码放在一个循环中,直到作业完成为止(使用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");
}