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