Hadoopでは、タスクの削減はいつ開始されますか?マッパーの特定の割合(しきい値)が完了した後に開始されますか?ある場合、このしきい値は修正されていますか?通常、どのようなしきい値が使用されますか?
削減フェーズには、シャッフル、ソート、削減の3つのステップがあります。シャッフルは、各マッパーからレデューサーによってデータが収集される場所です。これは、データ転送のみであるため、マッパーがデータを生成しているときに発生する可能性があります。一方、ソートとリデュースは、すべてのマッパーが完了した後にのみ開始できます。リデューサーの完了率を見ると、どのMapReduceが実行されているかを知ることができます。0-33%はシャッフル、34-66%はソート、67%-100%はリデュースを意味します。これが、レデューサーが時々33%で「スタック」しているように見える理由です。マッパーが終了するのを待っています。
レデューサーは、完了したマッパーの割合のしきい値に基づいてシャッフルを開始します。パラメーターを変更して、減速機を遅かれ早かれ始動させることができます。
減速機を早期に起動するのはなぜ良いことですか?マッパーからレデューサーへのデータ転送が時間とともに分散するため、ネットワークがボトルネックになっている場合に便利です。
減速機を早期に開始するのはなぜ悪いことですか?データをコピーし、マッパーが終了するのを待つ間、スロットを「占有」するためです。後で開始して実際にリデューススロットを使用する別のジョブは、現在それらを使用できません。
mapred.reduce.slowstart.completed.maps
のmapred-site.xml
のデフォルト値を変更することにより、減速機の起動時にカスタマイズできます。 1.00
の値は、レデューサーを開始する前にすべてのマッパーが完了するのを待ちます。 0.0
の値は、レデューサーをすぐに開始します。 0.5
の値は、マッパーの半分が完了したときにレデューサーを開始します。ジョブごとにmapred.reduce.slowstart.completed.maps
を変更することもできます。 Hadoopの新しいバージョン(少なくとも2.4.1)では、パラメーターはmapreduce.job.reduce.slowstart.completedmaps
と呼ばれます(ユーザーyegor256に感謝)。
通常、システムで一度に複数のジョブが実行されている場合は、mapred.reduce.slowstart.completed.maps
を0.9
より上に保持するのが好きです。このように、データをコピーする以外に何もしていない場合、ジョブはレデューサーを占有しません。一度に1つのジョブしか実行していない場合は、おそらく0.1
を実行するのが適切でしょう。
リデューサーが呼び出されるずっと前に、リデュースフェーズを開始できます。 「a」マッパーがジョブを完了するとすぐに、生成されたデータはソートとシャッフル(コンバイナーとパーティショナーへの呼び出しを含む)を受けます。レデューサーの「フェーズ」は、マッパーデータ処理後の開始時に開始されます。これらの処理が完了すると、レデューサーの割合の進捗が表示されます。ただし、リデューサーはまだ呼び出されていません。使用可能な/使用されているプロセッサの数、データの性質、および予想されるリデューサーの数に応じて、上記の@ Donald-minerの説明に従ってパラメーターを変更することができます。
Reduceフェーズはマップフェーズから開始し、マップのレコードを消費し続けます。ただし、マップフェーズの後にソートおよびシャッフルフェーズがあるため、すべての出力をソートしてレデューサーに送信する必要があります。したがって、論理的には、マップフェーズの後でのみリデュースフェーズが開始されることを想像できますが、実際にはパフォーマンス上の理由から、リデューサーもマッパーで初期化されます。
リデュースフェーズに表示される割合は、実際にはマップ出力からリデューサー入力ディレクトリにコピーされたデータの量です。このコピーがいつ開始されるかを知るには?これは、上記のドナルドが示したように設定できる構成です。すべてのデータがレデューサーにコピーされると(100%レデュース)、レデューサーが動作を開始するため、レデューサーコードがI/OまたはCPUを集中的に使用する場合、「100%レデュース」でフリーズする可能性があります。
Reduceは、すべてのマッパーがタスクをフィッシングした後にのみ開始されます。Reducerは、すべてのマッパーと通信する必要があるため、最後のマッパーがタスクを完了するまで待機する必要があります。