2013-05-27 3 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 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"); 
}  
+0

Что именно нужно это общее время для картографов (и переходников), когда работа делается. То есть, мне нужна информация, которую можно найти в веб-интерфейсе jobtracker. –

Смежные вопросы