Hadoopでは、reduceタスクはいつ開始されますか?マッパーの特定の割合(しきい値)が完了した後に開始しますか?もしそうなら、このしきい値は固定されていますか?通常、どのような種類のしきい値が使用されますか?
回答:
削減フェーズには、シャッフル、並べ替え、削減の3つのステップがあります。シャッフルは、各マッパーからレデューサーによってデータが収集される場所です。これは、データ転送のみであるため、マッパーがデータを生成しているときに発生する可能性があります。一方、並べ替えと削減は、すべてのマッパーが完了した後でのみ開始できます。レデューサーの完了率を確認することで、1つの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もマッパーで初期化されます。
マップリデュースタスクがどのように機能するかをよりよく理解するために、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 )(だった、62)
レデューサータスクはcompletion
、すべてのマッパーの後にのみ開始されます。
ただし、データ転送はeach
Mapの後に行われます。実はプル操作です。
つまり、レデューサーはすべてのmaptaskに、Mapから取得するデータがあるかどうかを尋ねるたびに、マッパーがタスクを完了したことを検出すると、Reducerは中間データをプルします。
Mapperからの中間データはに保存されdisk
ます。また、マッパーからリデュースへのデータ転送Data Locality
はネットワークを介して行われます(リデュースフェーズでは保持されません)