0

ジョブを Hadoop クラスターに送信し、ジョブの入力がノード間で分割された後、一部のタスクが 2 つの試行を並行して実行していることがわかります。

たとえば、ノード 39 でタスク試行attempt_201305230321_0019_m_000073_0が開始され、3 分attempt_201305230321_0019_m_000073_1後にノード 25 で開始されます。さらに 4 分で、最初の試行 ( attempt_201305230321_0019_m_000073_0) が強制終了され (通知なし、ログには情報が含まれません)、2 回目の試行は 30 分で正常に完了します。

何が起こっているのですか?重複した試行の作成を防ぐにはどうすればよいですか? これらの重複した試みが謎の殺害を引き起こす可能性はありますか?

4

1 に答える 1

3

投機的実行を開きましたか? 次のコードを使用して、それを防ぐことができます。

job.getConfiguration().setBoolean(                                                                                                                 
                "mapred.map.tasks.speculative.execution", false);                                                                                          
job.getConfiguration().setBoolean(                                                                                                                 
                "mapred.reduce.tasks.speculative.execution", false);  

Hadoop ドキュメントからの投機的実行に関する定義は次のとおりです。

投機的実行: Hadoop システムの問題の 1 つは、タスクを多数のノードに分割することで、少数の低速ノードが残りのプログラムのレートを制限する可能性があることです。たとえば、1 つのノードに低速のディスク コントローラがある場合、他のすべてのノードの 10% の速度で入力を読み取っている可能性があります。そのため、99 個のマップ タスクが既に完了している場合でも、システムは最後のマップ タスクのチェックインを待機しており、他のすべてのノードよりもはるかに時間がかかります。

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

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

于 2013-05-27T14:54:06.377 に答える