0

ジョブを取得して開始するジョブのプールがあります。パターンは次のようなものです。

    Job job = JobPool.getJob();
    job.waitForCompletion();
    JobPool.release(job);

ジョブ オブジェクトを再利用しようとすると、ジョブ オブジェクトが実行されないという意味で問題が発生します (ほとんどの場合、ステータスが COMPLETED であるためです)。したがって、次のスニペットでは、2 番目のwaitForCompletion呼び出しでジョブの統計/カウンターが出力され、他には何も行われません。

    Job jobX = JobPool.getJob();
    jobX.waitForCompletion();
    JobPool.release(jobX);

    //.......

    Job jobX = JobPool.getJob();
    jobX.waitForCompletion(); // <--- here the job should run, but it doesn't 

Hadoop がステータスを完了と見なし、ジョブを実行しようとしないため、実際にはジョブが実行されないというのは正しいですか? はいの場合、再利用できるようにジョブ オブジェクトをリセットする方法を知っていますか?

4

1 に答える 1

1

Javadocには、ジョブを 1 回だけ実行する必要があるというヒントが含まれています。

set メソッドは、ジョブが送信されるまでのみ機能し、その後は IllegalStateException をスローします。

仕事と仕事の見方については、混乱があると思います。後者はあなたが持っているもので、hadoop で実行されている最大 1 つのジョブにマップするように設計されています。ジョブのビューは基本的に軽量であり、そのオブジェクトの作成が実際にジョブを実行するのに比べて高価である場合...まあ、あなたのジョブは十分に単純であるため、hadoop は必要ないと信じなければなりません。

ビューを使用してジョブを送信すると、コストがかかる可能性があります (クラスターへの jar のコピー、JobTracker でのジョブの初期化など)。概念的には、ジョブトラッカーに「再実行」または「コピー;実行」を指示するという考えは理にかなっています。私の知る限り、これらのアイデアのいずれも実際にはサポートされていません。Hadoop は実際には、どちらのユース ケースにも対応する保持ポリシーを保証していないのではないかと思います。

于 2012-10-15T22:07:23.547 に答える