Hadoopでは、reduceタスクはいつ開始されますか?マッパーの特定の割合(しきい値)が完了した後に開始しますか?もしそうなら、このしきい値は固定されていますか?通常、どのような種類のしきい値が使用されますか?
8 に答える
削減フェーズには、シャッフル、ソート、削減の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フェーズはマップフェーズから始まり、マップからレコードを消費し続けます。ただし、マップフェーズの後にソートとシャッフルのフェーズがあるため、すべての出力をソートしてレデューサーに送信する必要があります。したがって、論理的には、reduceフェーズはmapフェーズの後でのみ開始されると想像できますが、実際にはパフォーマンス上の理由から、reducerもマッパーで初期化されます。
リデュースフェーズで表示されるパーセンテージは、実際には、マップ出力からレデューサー入力ディレクトリにコピーされたデータの量に関するものです。このコピーはいつ開始されますか?これは、ドナルドが上に示したように設定できる構成です。すべてのデータがレデューサーにコピーされると(つまり、100%リデュース)、レデューサーが機能し始めます。したがって、レデューサーコードがI / OまたはCPUを集中的に使用する場合、「100%リデュース」でフリーズする可能性があります。
Reduceは、すべてのマッパーがタスクをフィッシングした後にのみ開始します。Reducerは、すべてのマッパーと通信する必要があるため、最後のマッパーがタスクを完了するまで待機する必要があります。ただし、マッパーは、タスクが完了した瞬間にデータの転送を開始します。
マップリデュースタスクがどのように機能するかをよりよく理解するために、WordCountの例を考えてみましょう。小説などの大きなファイルがあり、ファイル内で各単語が出現する回数を見つけることがタスクであるとします。ファイルは大きいため、異なるブロックに分割され、異なるワーカーノードに複製される場合があります。単語数カウントジョブは、mapおよびreduceタスクで構成されています。マップタスクは、各ブロックを入力として受け取り、中間のキーと値のペアを生成します。この例では、単語の出現回数をカウントしているため、ブロックの処理中にマッパーは(word1、count1)、(word2、count2)などの形式の中間結果になります。すべてのマッパーの中間結果は次のようになります。中間結果を並べ替えるシャッフルフェーズを通過しました。
さまざまなマッパーからのマップ出力が次の形式であると想定します。
マップ1:-(is、24)(was、32)(and、12)
Map2 :-( my、12)(is、23)(was、30)
マップ出力は、同じキー値が同じレデューサーに与えられるようにソートされます。ここでは、is、wasなどに対応するキーが同じレデューサーになることを意味します。最終出力を生成するのはレデューサーであり、この場合は次のようになります。-(and、12)(is、47)(my、12 )(was、62)
レデューサータスクはcompletion
、すべてのマッパーの後にのみ開始されます。
ただし、データ転送はeach
Mapの後に行われます。実はプル操作です。
つまり、レデューサーはすべてのmaptaskに、Mapから取得するデータがあるかどうかを尋ねるたびに、マッパーがタスクを完了したことを検出すると、Reducerは中間データをプルします。
Mapperからの中間データはに保存されdisk
ます。また、マッパーからリデュースへのデータ転送はネットワークを介して行われます(Data Locality
リデュースフェーズでは保持されません)
Mapperがタスクを終了すると、Reducerはデータを削減するジョブを開始します。これはMapreduceジョブです。