2013-05-27 129 views
2

我需要不斷獲取映射器和縮減器的運行時間。我已經提交了如下的工作。提交Hadoop作業

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

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"); 
}  
+0

我究竟需要的是映射器(和減速)時,作業完成的總時間。也就是說,我需要可以在jobtracker Web界面中找到的信息。 –