Map Reduceプログラミングのリデューサーでシャッフルとソートのフェーズの目的は何ですか?


113

Map Reduceプログラミングでは、reduceフェーズはそのサブパートとしてシャッフル、ソート、reduceを行います。並べ替えはコストのかかる作業です。

Map Reduceプログラミングのリデューサーでシャッフルとソートのフェーズの目的は何ですか?


3
マッパーからの出力はリデューサーの入力であり、キースペースに基づいてソートされ、各リデューサー入力のバケットに分割されるため、これは常に必要であると私はいつも思っていました。
BasicHorizo​​n

回答:


171

まず第一に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のメンバーなので、かなり信頼でき、公式だと思います...


「並べ替えは、レデューサーの時間を節約し、新しい削減タスクをいつ開始するかを簡単に区別できるようにします。簡単に言えば、並べ替えられた入力データの次のキーが前と異なる場合、新しい削減タスクを開始するだけです。」この部分はわかりません。マッパーはパーティショナーを使用して、スピルをローカルのパーティションに分割し、各パーティションを削減に送信します。ここでソートはどのように役立ちますか?
MaxNevermind 2016年

1
@MaxNevermind x個のreduceタスク(パーティション)がある場合でも、reduce()メソッドをx回呼び出すことになるわけではありません。個別のキーごとに1回呼び出されます。したがって、1つのreduceタスクでreduce()メソッドを何度も呼び出すことができます。
vefthym 2016年

「個別のキーごとに1回呼び出されます」なぜですか?マッパーは、パーティションを任意の方法で作成し(個別のキーごとに1つのパーティションである必要はありません)、各パーティションをレデューサーに移動しますが、間違っていますか?
MaxNevermind 2016年

1
@MaxNevermindマッパーはキーと値を出力し、パーティションを形成しません。パーティションは、ユーザーが定義する削減タスクの数とパーティショナーの実装によって定義されます。同じキーを持つすべてのマッパーの出力は、同じreduce()メソッドに送られます。これは変更できません。ただし、変更できるのは、他のキー(存在する場合)が同じパーティションに配置されるため、同じタスクで処理されるキーです。reduceタスクはreduce()関数を複数回呼び出すことができますが、すべてのキーに対して1回だけです。
vefthym 2016年

2
わかった。私の問題は、reduceが1つのキーと値のペアではなく、値のリストを引数として取るのを忘れていたことです。私はあなたの答えでこれを詳しく説明する必要があると思います:「各リデュースタスクはキーと値のペアのリストを受け取りますが、key-List <値>を受け取るリデュースメソッドを呼び出す必要があるため、キーごとに値をグループ化する必要があり、簡単です入力データがマッパー段階で事前にソートされている場合、」実行する
MaxNevermind

42

Mapreduceプログラムの主要なフェーズをもう一度見てみましょう。

地図相は、マッパーによって行われます。マッパーは、ソートされていない入力キー/値ペアで実行されます。各マッパーは、各入力キー/値ペアに対してゼロ、1、または複数の出力キー/値ペアを発行します。

結合相は、コンバイナによって行われます。コンバイナは、同じキーで、キー/値のペアを組み合わせる必要があります。各コンバイナは、ゼロ、1回、または複数回実行できます。

シャッフル、ソート相は、フレームワークによって行われます。すべてのマッパーからのデータはキーでグループ化され、リデューサー間で分割され、キーでソートされます。各レデューサーは、同じキーに関連付けられているすべての値を取得します。プログラマーは、ソート用のカスタム比較関数とデータ分割用のパーティショナーを提供できます。

パーティは減速が特定のキーと値のペアを取得するかを決定します。

減速の取得は、キー/ [値リスト]対をソートキーによってソート。値リストには、マッパーによって生成された同じキーを持つすべての値が含まれます。各レデューサーは、各入力キー/値ペアに対してゼロ、1つ、または複数の出力キー/値ペアを出力します

理解を深めるために、マリアジュルコビコワによるこのjavacodegeeksの記事とダッタによるmssqltipsの記事をご覧ください。

以下はsafaribooksonlineの記事からの画像です

ここに画像の説明を入力してください


画像にタイプミスがあると思います(これはここにコピーされているだけです)。私は、ieレデューサーと出力の下の文字列が実際にあるはずだと思いますis
Jeff Evans

32

上記の回答に欠けている点をいくつか追加することを考えました。ここから取ったこの図は、実際に何が起こっているかを明確に示しています。

ここに画像の説明を入力してください

もう一度言いますと

  • 分割:処理負荷を異なるノード(マッパー)に分散することで並列処理を改善し、全体の処理時間を節約します。

  • 結合:各マッパーの出力を縮小します。あるノードから別のノードにデータを移動するための時間を節約できます。

  • 並べ替え(シャッフル&並べ替え):ランタイムが新しいレデューサーを簡単にスケジュール(スポーン/開始)できるようにします。現在のキーが前のキーと異なる場合は、並べ替えられたアイテムリストの処理中に新しいレデューサーを生成できます。 。


このグラフのどこに分割ステップが入りますか?マップ後、結合前?
ジョエル

@ジョエル私はあなたが「スプリット」ステップを参照してほしいと思いますか?
Supun Wijerathne

いいえ、パーティションのステップを意味します。デフォルトで単純なハッシュモジュロを使用して、どのリデューサーにデータを送信するかを決定します。さらに調査を行った後、結合ステップの後、シャッフル&ソートする前と考えています。
ジョエル

1
@ジョエル私はあなたが何を説明するつもりなのかはっきりしていません。簡単に言えば、正確な手順のシーケンスは、かなり問題固有のものになる可能性があります。一部のシナリオでは、並べ替えも不要であると言えます。入力に戻って、上記の単純なワードカウントの例について具体的に説明した場合、レデューサーを決定するためにそのようなパーティション分割の必要性は実際には見られません。ここでは、キーごとにリポーンするのは非常に簡単です。しかし、あなたの主張がいくつかのシナリオに当てはまる可能性があると私は推測できます。率直に言って、私はそれについて正確な明確な考えを持っていません。
Supun Wijerathne

4

一部のデータ処理要件では、並べ替えはまったく必要ありません。Syncsortは、Hadoopでの並べ替えをプラグイン可能にしました。ここに彼らからのソートに関する素晴らしいブログがあります。データをマッパーからリデューサーに移動するプロセスは、シャッフルと呼ばれます。詳細については、この記事を確認しください。


2

マッパーからの出力はリデューサーの入力であり、キースペースに基づいてソートされ、各リデューサー入力のバケットに分割されるため、これは常に必要であると私はいつも思っていました。Keyのすべての同じ値が同じバケットで最終的にリデューサーに送られるようにして、それらが一緒に削減されるようにします。K1、V2およびK1、V4を削減するために一緒にする必要があるため、異なる削減者に送信する意味はありません。

できるだけ簡単に説明してみました


k1、v1とk1、v4を同じレデューサーに送信する場合は、シャッフルできます。次に、並べ替えの目的は何ですか?
Nithin K Anil 2014

1つの理由は、入力がソートされていない場合にMapReduceジョブがすべてのKVペアをレデューサーに送信する場合、複数の理由でソートを実行します。K1、VXのすべてのインスタンスを取得するには、すべてのマッパー出力をスキャンする必要があります。 。一方、K2、VXが選択されるとすぐにマッパーの出力がソートされる場合、K1、VXのすべてが選択され、そのセットをレデューサーに送信して処理できることがわかりますが、これの利点はありません。各レデューサーが削減を開始するためには、すべてのレデューサーの準備ができるまで待つ必要があります。
BasicHorizo​​n 2014年

また、集約に関しては、レデューサーがK2、V2をピックアップするとすぐにレデューサーへの入力がソートされる場合、K1、V1のすべてを集約することを指定すると、K1、V1のインスタンスが存在しないことがわかります。集約を完了することができますが、レデューサー入力が並べ替えられていない場合は、K1、V1の入力全体をスキャンする必要があります
BasicHorizo​​n

2

シャッフルは、マッパーからの中間データが0、1以上のレデューサーに転送されるプロセスです。各レデューサーは、レデューサーの数に応じて、1つ以上のキーとそれに関連する値を受け取ります(負荷のバランスをとるため)。さらに、各キーに関連付けられた値はローカルでソートされます。


0

MapReduceがネイティブに行うことは、ソートと(ソートによって実装される)スケーラブルなGroupByの2つだけです。

MapReduce上のほとんどのアプリケーションとデザインパターンは、シャッフルと並べ替えによって提供されるこれらの2つの操作に基づいて構築されています。


0

これは良い読書です。それが役に立てば幸い。ソートに関しては、マップの最後のステップのマージ操作用だと思います。マップ操作が完了し、結果をローカルディスクに書き込む必要がある場合、バッファから生成されたスプリットに対してマルチマージが実行されます。また、マージ操作では、各パーティションを詳細にソートすると役立ちます。


0

まあ、MapreduceにはMapperreducerの 2つの重要なフレーズがありますが、reducerはどちらも重要ですが、reduceは必須です。一部のプログラムでは、レデューサーはオプションです。今あなたの質問に来ます。Mapreduceでは、シャッフルと並べ替えが2つの重要な操作です。最初のHadoopフレームワークは、構造化/非構造化データを受け取り、データをキーと値に分離します。

Mapperプログラムは、データを分離して、処理するキーと値に配置します。キー2と値2の値を生成します。この値は、適切な順序で処理および再配置して、目的のソリューションを取得する必要があります。これで、このシャッフルと並べ替えがローカルシステムで行われ(フレームワークで処理されます)、プロセスフレームワークがローカルシステムでデータをクリーンアップした後、ローカルシステムで処理されます。OK

ここでは、コンバイナパーティションを使用して、このシャッフルとソートプロセスを最適化します。適切な配置の後、これらのキー値はReducerに渡され、目的のクライアントの出力が取得されます。最後に、Reducerが目的の出力を取得します。

K1、V1-> K2、V2(プログラムマッパーを作成します)、-> K2、V '(ここではデータをシャッフルしてソフトにします)-> K3、V3出力を生成します。K4、V4。

これらの手順はすべて論理演算のみであり、元のデータを変更しないことに注意してください。

あなたの質問:Map Reduceプログラミングのリデューサーでシャッフルとソートのフェーズの目的は何ですか?

短い答え:データを処理して目的の出力を得る。シャッフルはデータを集約し、削減は期待される出力を取得します。

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