web-dev-qa-db-ja.com

MapReduce / Hadoopを使用した大きなデータの並べ替え

私はMapReduceについて読んでいて、次のことが私を混乱させています。

100万エントリ(整数)のファイルがあり、MapReduceを使用してそれらをソートしたいとします。私がそれについて理解する方法は次のとおりです:

整数をソートするマッパー関数を記述します。したがって、フレームワークは入力ファイルを複数のチャンクに分割し、それらを異なるマッパーに提供します。各マッパーは、互いに独立してデータのチャンクをソートします。すべてのマッパーが完了したら、各結果をReducerに渡し、結果を結合して最終出力を取得します。

私の疑問は、レデューサーが1つある場合、最終的に結果を1か所で結合する必要がある場合、分散フレームワークをどのように活用するかです。この問題は、1か所で100万のエントリをマージするためにドリルダウンします。そうですか、それとも私は何か不足していますか?

ありがとう、チャンダー

32

マージソートをチェックしてください。

部分的にソートされたリストをソートする方が、リスト全体をソートするよりも操作とメモリ消費の点ではるかに効率的であることがわかります。

リデューサーが4つの並べ替えられたリストを取得する場合、4つのリストの最小の要素を探してそれを選択するだけです。リストの数が一定の場合、この削減はO(N)演算です。

また、通常、レデューサーもツリーのようなものに「分散」されているため、作業も並列化できます。

23
Peter Tillemans

他の人が述べたように、マージは並べ替えよりもはるかに簡単なので、大きなメリットがあります。

ただし、巨大なデータセットでO(N)シリアル演算を実行することも禁止されている可能性があります。正しく指摘したように、並列でマージを実行する方法を見つけることをお勧めします。 。

これを行う1つの方法は、パーティション分割関数をランダムパーティショナー(通常使用されるもの)から少し賢いものに置き換えることです。たとえば、Pigがこれに対して行うのは、データセットをサンプリングして値の大まかな分布を概算し、値の範囲をさまざまなレデューサーに割り当てます。レデューサー0はすべての要素<1000を取得し、レデューサー1はすべての要素> = 1000および<5000を取得します。次に、並行してマージを行うことができます。最終的な結果は、各レデューサータスクの数がわかっているように並べ替えられます。

13
SquareCog

したがって、map-reduceを使用してソートする最も簡単な方法は(最も効率的な方法ではありませんが)次のようにすることです

マップフェーズ(Input_Key、Input_Value)の間に(Input_Value、Input Key)を出力します。

レデューサーはIdentity Reducerです

したがって、たとえば、データが学生、年齢のデータベースである場合、マッパー入力は( 'A'、1)( 'B'、2)( 'C'、10)...となり、出力は(1、 A)(2、B)(10、C)

このロジックは試していませんが、私が取り組んでいる宿題の問題の第一歩です。更新のソースコード/ロジックリンクを配置します。

7
rOrlig

遅くなってすみませんが、将来の読者のために、はい、チャンダー、あなたは何かを逃しています。

ロジックは、Reduceがシャッフルされた後、実行されているノードのデータのみをソートできるということです。つまり、あるノードで実行されるレデューサーは他のノードのデータを見ることができず、データのみに削減アルゴリズムを適用します。そのため、マージソートのマージ手順は適用できません。

そのため、ビッグデータの場合、TeraSortを使用します。TeraSortは、カスタムパーティショナーを備えたIDマッパーおよびリデューサーにすぎません。詳しくはこちら HadoopによるTeraSortの実装 。それは述べています:

「TeraSortは標準のマップ/リデュースソートですが、各リデュースのキー範囲を定義するN − 1のサンプルキーのソートされたリストを使用するカスタムパーティショナーを除きます。特に、sample [i − 1] <= key <sample [i]はreduce iに送信されます。これにより、reduce iの出力がすべてreduce i + 1の出力より小さくなることが保証されます。

2
Alok Nayak

並べ替えは、MapReduceを使用して効率的に実装できます。しかし、あなたはこの目的を達成するためにmapreduceを使用してマージソートを実装することを考えているようです。それは理想的な候補ではないかもしれません。

先ほど触れたように、(map-reduceを使用した)マージソートには次の手順が含まれます。

  1. 要素を小さなグループに分割し、各グループをラウンドロビン方式でマッパーに割り当てます
  2. 各マッパーはサブセットを並べ替えて{K、{subset}}を返します。Kはすべてのマッパーで同じです
  3. すべてのマッパーで同じKが使用されるため、1つのリデューサーのみ、したがって1つのリデューサーのみが使用されます。レデューサーはデータをマージし、ソートされた結果を返すことができます

ここでの問題は、あなたが言及したように、削減フェーズ中に並列処理を妨げる削減器が1つしか存在できないことです。他の返信で言及されたように、この目的のために、terasortなどのmapreduce固有の実装を検討できます。

説明は http://www.chinacloud.cn/upload/2014-01/14010410467139.pdf にあります

マージソートに戻ると、hadoop(または同等の)ツールがレデューサーの階層を提供し、あるレベルのレデューサーの出力が次のレベルのレデューサーに行くか、同じセットのレデューサーにループバックする場合、これは実現可能です。

1

複数のsortedアイテムを組み合わせる方が、複数のnsortedアイテムを組み合わせるよりも効率的だと思います。したがって、マッパーはチャンクをソートするタスクを実行し、レデューサーはそれらをマージします。マッパーがソートを行わなかった場合、レデューサーはソートを行うのに苦労するでしょう。

1
Gopi