1

Hadoop CapacityScheduler は、使用可能なメモリがスケジュールされているジョブのニーズを満たさない場合 (TaskSchedulingMgr.getTaskFromQueue(...))、TaskTracker のスロットを予約します。ただし、これによりデッドロックが発生しますか? 2 つの異なるキューから 2 つの異なるジョブがあり、各マップ タスクには 3 つのスロットが必要だとします。各マシンには 4 つのマップ スロットしかありません。最初に、ジョブ 1 がスケジュールされているとき、マシン A で使用可能なスロットが 2 つあるため、ジョブ 1 はこれらの 2 つのスロットを予約します。その後、ジョブ 2 がマシン A でスケジュールされると、別の 2 つのスロットが使用可能になるため、ジョブ 2 は残りの 2 つのスロットを予約します。この場合、ジョブ 1 もジョブ 2 も、マシン A で実行するのに十分なスロットを取得できません。

これが起こらないように CapacityScheduler にスキームはありますか?

4

1 に答える 1

2

良い質問!私も答えを知らなかったので、それを実行する以外に確認する良い方法はありません:)

ストーリーの Reduce バージョンだけを考えてみましょう。これを見るには 2 つの方法があります。

  1. ジョブの削減フェーズを完了するには、3 つのタスクを削減する必要があります
  2. 3 スロット分の仮想メモリを必要とするタスクを減らす

どちらの場合も、ジョブは互いに数分の 1 秒前後でジョブ トラッカーに送信されます。どちらの場合も、最初のジョブが完了するまで、2 番目のジョブは強制的に中断されます。デッドロックは発生しません。リソースは、2 番目から完了するまで不足しています。このようなデッドロックが発生しない理由についての私の「推測」は、「その他の」現在使用されていないキューの「残りの未使用」リソースが実行中のジョブに割り当てられ、実行に必要なリソースを構成することです。したがって、2番目を飢えさせ、サスペンドします。

当然、#2 の結果として、各タスクは一度に 1 つずつ実行されます。これは、各タスクが 3 つのスロットが使用可能になるまで待機し、各タスクが一度に 1 つずつ実行されるためです。それが役立つことを願っています。

于 2014-04-16T22:21:02.073 に答える