Hadoopでreduceタスクはいつ開始されますか?


81

Hadoopでは、reduceタスクはいつ開始されますか?マッパーの特定の割合(しきい値)が完了した後に開始しますか?もしそうなら、このしきい値は固定されていますか?通常、どのような種類のしきい値が使用されますか?

回答:


205

削減フェーズには、シャッフル、並べ替え、削減の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するのがおそらく適切です。


3
あなたが言ったことについてどこでもっと読むことができるか知っていますか?
空想家2012

1
スロースタートは、私の意見ではほとんど文書化されていません....ほとんどのあいまいな構成パラメーターもそうです。
ドナルドマイナー2012

5
良い答え@ドナルドマイナー。新しいHadoopバージョン(私は1.1.2を使用しています)でそれを追加したいだけで、値はデフォルトで0.05に設定されています。hadoop.apache.org/docs/r1.1.2/mapred-default.html
sufinawaz

@Donaldバージョン0.20.205.0のhadoopを使用しており、mapred-site.xmlのパラメーター「mapred.reduce.slowstart.completed.maps」を0.1に設定していますが、マッパーが完了した後もレデューサーは実行されます。理由を教えてもらえますか?
ハリーポッター2014

3
@nishm削減フェーズ全体の用語と、削減フェーズ内での削減の用語を混同していると思います。削減フェーズは、シャッフル、ソート、および削減です。Slowstartは、フェーズ全体をいつ開始するかを指示します。削減フェーズ内の削減は、マッパーが終了したときにのみ開始されるのは正しいことです。
ドナルドマイナー

5

削減フェーズは、レデューサーが呼び出されるずっと前に開始できます。「a」マッパーがジョブを終了するとすぐに、生成されたデータはソートとシャッフル(コンバイナーとパーティショナーの呼び出しを含む)を受けます。レデューサーの「フェーズ」は、マッパー後のデータ処理が開始された瞬間に始まります。これらの処理が完了すると、レデューサーのパーセンテージが向上します。ただし、レデューサーはまだ呼び出されていません。使用可能な/使用されているプロセッサーの数、データの性質、および予想されるレデューサーの数に応じて、上記の@ Donald-minerで説明されているようにパラメーターを変更することをお勧めします。


1

私が理解している限り、Reduceフェーズはマップフェーズから始まり、マップからレコードを消費し続けます。ただし、マップフェーズの後にソートとシャッフルのフェーズがあるため、すべての出力をソートしてレデューサーに送信する必要があります。したがって、論理的には、reduceフェーズはmapフェーズの後でのみ開始されると想像できますが、実際にはパフォーマンス上の理由から、reducerもマッパーで初期化されます。


0

リデュースフェーズで表示されるパーセンテージは、実際には、マップ出力からレデューサー入力ディレクトリにコピーされたデータの量に関するものです。このコピーはいつ開始されますか?これは、ドナルドが上に示したように設定できる構成です。すべてのデータがレデューサーにコピーされると(つまり、100%リデュース)、レデューサーが機能し始めるため、レデューサーコードがI / OまたはCPUを集中的に使用する場合、「100%リデュース」でフリーズする可能性があります。


0

レデュースは、すべてのマッパーがタスクをフィッシングした後にのみ開始されます。レデューサーはすべてのマッパーと通信する必要があるため、最後のマッパーがタスクを完了するまで待機する必要があります。ただし、マッパーはタスクを完了した瞬間にデータの転送を開始します。


-1

マップリデュースタスクがどのように機能するかをよりよく理解するために、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)


レデューサーがいつ起動するかというOPの質問には対応していません。
サイキリティバダム

-1

レデューサータスクはcompletion、すべてのマッパーの後にのみ開始されます。

ただし、データ転送はeachMapの後に行われます。実はプル操作です。

つまり、レデューサーはすべてのmaptaskに、Mapから取得するデータがあるかどうかを尋ねるたびに、マッパーがタスクを完了したことを検出すると、Reducerは中間データをプルします。

Mapperからの中間データはに保存されdiskます。また、マッパーからリデュースへのデータ転送Data Localityはネットワークを介して行われます(リデュースフェーズでは保持されません)


-2

Mapperがタスクを終了すると、Reducerはデータを削減するジョブを開始します。これはMapreduceジョブです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.