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 ジョブの開始や完了を待たずに、呼び出し側プログラムに制御をすぐに返します。待機したい場合は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 に答える