提交Hadoop作业

时间:2013-05-27 18:52:00

标签: hadoop mapreduce

我需要不断获得映射器和减速器的运行时间。我提交的工作如下。

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

1 个答案:

答案 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");
}