投機的実行を開きましたか? 次のコードを使用して、それを防ぐことができます。
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 に設定することで、マッパーとリデューサーの投機的実行を無効にすることができます。