web-dev-qa-db-ja.com

Hadoopの投機的なタスク実行

GoogleのMapReduceペーパーでは、バックアップタスクがあります。Hadoopの投機的タスクと同じことだと思います。投機的タスクはどのように実装されますか?投機的タスクを開始するとき、タスクは最初の古いものからゆっくりと開始しますか、それとも古いタスクが到達した場所から開始しますか(もしそうなら、すべての中間ステータスとデータをコピーする必要がありますか?)

30
lil

Hadoopシステムの問題の1つは、タスクを多数のノードに分割することにより、いくつかの遅いノードがプログラムの残りをレート制限する可能性があることです。

タスクは、ハードウェアの劣化やソフトウェアの構成ミスなど、さまざまな理由で遅くなる場合がありますが、予想よりも長い時間が経過してもタスクが正常に完了するため、原因の検出が困難になる場合があります。 Hadoopは、実行速度の遅いタスクを診断および修正しようとしません。代わりに、タスクの実行速度が予想よりも遅いことを検出し、別の同等のタスクをバックアップとして起動します。これは、タスクの投機的実行と呼ばれます。

たとえば、あるノードのディスクコントローラが遅い場合、他のすべてのノードの10%の速度で入力を読み取っている可能性があります。したがって、99個のマップタスクが既に完了している場合、システムは最終的なマップタスクのチェックインを待機しています。これは他のすべてのノードよりも時間がかかります。

タスクを互いに分離して実行することを強制することにより、個々のタスクは入力がどこから来たかを知りません。タスクはHadoopプラットフォームを信頼して、適切な入力を提供するだけです。したがって、マシンの機能の違いを利用するために、同じ入力を複数回並行して処理できます。ジョブ内のタスクのほとんどが終了に近づいているため、Hadoopプラットフォームは、実行する他の作業がない複数のノードにわたって残りのタスクの冗長コピーをスケジュールします。このプロセスは投機的実行と呼ばれます。タスクが完了すると、この事実をJobTrackerに通知します。タスクのコピーが最初に終了すると、最終的なコピーになります。他のコピーが投機的に実行されていた場合、HadoopはTaskTrackerにタスクを放棄してその出力を破棄するように指示します。レデューサーは、最初に正常に完了したマッパーから入力を受け取ります。

投機的実行はデフォルトで有効になっています。古いAPIを使用してmapred.map.tasks.speculative.executionおよびmapred.reduce.tasks.speculative.execution JobConfオプションをそれぞれfalseに設定すると、マッパーとレデューサーの投機的実行を無効にできますが、新しいAPIではmapreduce.map.speculativeおよびmapreduce.reduce.speculative

あなたの質問に答えるために、それは新たに始まり、他のタスクがどれだけ完了/完了したかには関係ありません。

リファレンス: http://developer.yahoo.com/hadoop/tutorial/module4.html

71
Amar