0

私はHadoopジョブを次のように起動していました

long start = new Date().getTime();
boolean status = job.waitForCompletion(true);            
long end = new Date().getTime();

このようにして、ジョブがコードで直接終了すると、ジョブにかかる時間を測定できます。

ここで、ジョブ間の依存関係を表現するために JobControl を使用する必要があります。

JobControl jobControl = new JobControl("MyJob");
jobControl.addJob(job1);
jobControl.addJob(job2);
job3.addDependingJob(job2);
jobControl.addJob(job3);

jobControl.run();

ただし、jobControl.run() が実行されると、コードが先に進むことはないため、ジョブの完了のために jobControl.getState() をポーリングするコードを含めることはできません。

JobControl を使用してジョブにかかった時間を測定するにはどうすればよいですか?

4

1 に答える 1

1

JobControl には、この情報をフックして取得できる便利な機能がありません。試してみるいくつかの(潜在的に苦痛な)オプションがあります:

  • 別のスレッドで開始JobControl.run()し、メイン スレッドでJobControl.getXXXJobs()メソッドをポーリングして、ジョブの状態がいつ変化したかを追跡します
  • Job End Notification URL hookの使用を検討してください。ただし、これにはクライアントで「サーバー」を起動して通知イベントを受信する必要があり、ジョブが終了した時点からさかのぼって作業を試みる必要があります。
  • JobControlおよびオブジェクトを拡張してjobcontrol.Job、ジョブの状態がいつ変化したかを追跡し、メソッドを追加して開始/終了時刻を照会します
于 2012-04-12T10:50:48.343 に答える