2

我需要不断地获取映射器和减速器的运行时间。我已提交如下作业。

 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)并且仍然能够获得运行时间?

4

1 回答 1

1

submitJob()方法立即将控制权返回给调用程序,而无需等待 hadoop Job 启动,更不用说完成了。如果您想等待,请使用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");
}    
于 2013-05-27T19:52:04.307 回答