回答:
まず第一にshuffling
、マッパーからリデューサーにデータを転送するプロセスです。それ以外の場合、リデューサーは入力(またはすべてのマッパーからの入力)を持つことができないため、リデューサーにとって必要であることは明らかです。 。マップフェーズが完了する前でもシャッフルを開始して、時間を節約できます。そのため、マップのステータスがまだ100%でない場合に、0%より大きい(ただし33%未満)削減ステータスを確認できます。
Sorting
減速機の時間を節約し、新しい減速タスクをいつ開始するかを簡単に区別できるようにします。簡単に言うと、ソートされた入力データの次のキーが前のキーと異なる場合、新しい削減タスクを開始するだけです。各reduceタスクはキーと値のペアのリストを受け取りますが、キーとリスト(値)の入力を受け取るreduce()メソッドを呼び出す必要があるため、キーごとに値をグループ化する必要があります。入力データがマップフェーズで(ローカルに)事前に並べ替えられ、レデュースフェーズで単純にマージソートされる場合(レデューサーは多くのマッパーからデータを取得するため)、これは簡単です。
Partitioning
、回答の1つで言及したことは、別のプロセスです。マップフェーズの出力である(キー、値)ペアが送信されるレデューサーを決定します。デフォルトのパーティショナーはキーのハッシュを使用してそれらをreduceタスクに配布しますが、それをオーバーライドして独自のカスタムパーティショナーを使用できます。
これらの手順の優れた情報源は、このYahooチュートリアルです。
これを図で表すと次のようになります(この図ではシャッフルを「コピー」と呼びます)。
注意shuffling
してsorting
、あなたがゼロレデューサーを指定した場合、すべてで実行されていません(setNumReduceTasks(0))。その後、MapReduceジョブはマップフェーズで停止し、マップフェーズにはいかなる種類のソートも含まれません(そのため、マップフェーズでさえ高速です)。
更新:より公式なものを探しているので、トムホワイトの本「Hadoop:The Definitive Guide」も読むことができます。ここにあなたの質問の興味深い部分があります。
Tom Whiteは2007年2月からApache Hadoopコミッターを務めており、Apache Software Foundationのメンバーなので、かなり信頼でき、公式だと思います...
Mapreduceプログラムの主要なフェーズをもう一度見てみましょう。
地図相は、マッパーによって行われます。マッパーは、ソートされていない入力キー/値ペアで実行されます。各マッパーは、各入力キー/値ペアに対してゼロ、1、または複数の出力キー/値ペアを発行します。
結合相は、コンバイナによって行われます。コンバイナは、同じキーで、キー/値のペアを組み合わせる必要があります。各コンバイナは、ゼロ、1回、または複数回実行できます。
シャッフル、ソート相は、フレームワークによって行われます。すべてのマッパーからのデータはキーでグループ化され、リデューサー間で分割され、キーでソートされます。各レデューサーは、同じキーに関連付けられているすべての値を取得します。プログラマーは、ソート用のカスタム比較関数とデータ分割用のパーティショナーを提供できます。
パーティは減速が特定のキーと値のペアを取得するかを決定します。
減速の取得は、キー/ [値リスト]対をソートキーによってソート。値リストには、マッパーによって生成された同じキーを持つすべての値が含まれます。各レデューサーは、各入力キー/値ペアに対してゼロ、1つ、または複数の出力キー/値ペアを出力します。
理解を深めるために、マリアジュルコビコワによるこのjavacodegeeksの記事とダッタによるmssqltipsの記事をご覧ください。
以下はsafaribooksonlineの記事からの画像です
ie
レデューサーと出力の下の文字列が実際にあるはずだと思いますis
。
上記の回答に欠けている点をいくつか追加することを考えました。ここから取ったこの図は、実際に何が起こっているかを明確に示しています。
もう一度言いますと
分割:処理負荷を異なるノード(マッパー)に分散することで並列処理を改善し、全体の処理時間を節約します。
結合:各マッパーの出力を縮小します。あるノードから別のノードにデータを移動するための時間を節約できます。
並べ替え(シャッフル&並べ替え):ランタイムが新しいレデューサーを簡単にスケジュール(スポーン/開始)できるようにします。現在のキーが前のキーと異なる場合は、並べ替えられたアイテムリストの処理中に新しいレデューサーを生成できます。 。
マッパーからの出力はリデューサーの入力であり、キースペースに基づいてソートされ、各リデューサー入力のバケットに分割されるため、これは常に必要であると私はいつも思っていました。Keyのすべての同じ値が同じバケットで最終的にリデューサーに送られるようにして、それらが一緒に削減されるようにします。K1、V2およびK1、V4を削減するために一緒にする必要があるため、異なる削減者に送信する意味はありません。
できるだけ簡単に説明してみました
MapReduceがネイティブに行うことは、ソートと(ソートによって実装される)スケーラブルなGroupByの2つだけです。
MapReduce上のほとんどのアプリケーションとデザインパターンは、シャッフルと並べ替えによって提供されるこれらの2つの操作に基づいて構築されています。
まあ、MapreduceにはMapperとreducerの 2つの重要なフレーズがありますが、reducerはどちらも重要ですが、reduceは必須です。一部のプログラムでは、レデューサーはオプションです。今あなたの質問に来ます。Mapreduceでは、シャッフルと並べ替えが2つの重要な操作です。最初のHadoopフレームワークは、構造化/非構造化データを受け取り、データをキーと値に分離します。
Mapperプログラムは、データを分離して、処理するキーと値に配置します。キー2と値2の値を生成します。この値は、適切な順序で処理および再配置して、目的のソリューションを取得する必要があります。これで、このシャッフルと並べ替えがローカルシステムで行われ(フレームワークで処理されます)、プロセスフレームワークがローカルシステムでデータをクリーンアップした後、ローカルシステムで処理されます。OK
ここでは、コンバイナとパーティションを使用して、このシャッフルとソートプロセスを最適化します。適切な配置の後、これらのキー値はReducerに渡され、目的のクライアントの出力が取得されます。最後に、Reducerが目的の出力を取得します。
K1、V1-> K2、V2(プログラムマッパーを作成します)、-> K2、V '(ここではデータをシャッフルしてソフトにします)-> K3、V3出力を生成します。K4、V4。
これらの手順はすべて論理演算のみであり、元のデータを変更しないことに注意してください。
あなたの質問:Map Reduceプログラミングのリデューサーでシャッフルとソートのフェーズの目的は何ですか?
短い答え:データを処理して目的の出力を得る。シャッフルはデータを集約し、削減は期待される出力を取得します。