MapReduceソートアルゴリズムはどのように機能しますか?


110

MapReduceの威力を示すために使用される主な例の1つは、Terasortベンチマークです。MapReduce環境で使用される並べ替えアルゴリズムの基本を理解できません。

私にとって、ソートは単に、他のすべての要素との関係における要素の相対位置を決定することを含みます。したがって、ソートには「すべて」と「すべて」の比較が含まれます。平均的な並べ替えアルゴリズム(クイック、バブルなど)は、これをスマートな方法で単純に実行します。

私の考えでは、データセットを多くの部分に分割するということは、1つの部分を並べ替えることができ、これらの部分を「完全な」完全に並べ替えられたデータセットに統合する必要があることを意味します。テラバイトのデータセットが数千のシステムに分散していることを考えると、これは大きな仕事になると思います。

それで、これは実際にどのように行われますか?このMapReduce並べ替えアルゴリズムはどのように機能しますか?

理解してくれてありがとう。

回答:


61

以下は、Terasortに対するHadoopの実装に関する詳細です

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

つまり、彼らの秘訣は、マップ段階でキーを決定する方法にあります。基本的に、それらは単一のレデューサーのすべての値が他のすべてのレデューサーに対して「事前にソート」されることが保証されることを保証します。

James Hamiltonのブログ投稿で論文の参照を見つけました。


3

Googleリファレンス:MapReduce:大規模クラスターでの簡素化されたデータ処理

登場
OSDI'04:オペレーティングシステムの設計と実装、第6回シンポジウム
サンフランシスコ、CA、2004年12月には。

そのリンクには、PDFおよびHTMLスライドの参照があります。

Wikipediaのページには、実装のリファレンスが記載された説明もあります。

また、批判、

並列データベースの先駆者であり、アーキテクチャを共有していないDavid DeWittとMichael Stonebrakerは、MapReduceが使用できる幅広い問題について、いくつかの議論の余地のある主張をしました。彼らはそのインターフェースを低レベルと呼び、それが本当に支持者が主張しているパラダイムシフトを表しているのか疑問を呈した。彼らはMapReduceの支持者の新規性の主張に異議を唱え、Teradataを20年以上にわたって存在してきた先行技術の例として引用しています。彼らはMapReduceプログラマーをCodasylプログラマーと比較し、両方とも「低レベルのレコード操作を実行する低レベル言語で記述している」と指摘しました。MapReduceの入力ファイルの使用とスキーマサポートの欠如により、Bツリーやハッシュパーティショニングなどの一般的なデータベースシステム機能によって可能になるパフォーマンスの向上が妨げられます。


前述のドキュメントに記載されているMapReduceの概念(のほとんど)を理解しています。ソートのアルゴリズムを理解しようとしています。
Niels Basjes、2009

1

GoogleのMapReduceペーパーを読んでいるときにも同じ質問がありました。@Yuval F答えは私のパズルをかなり解決しました。

紙を読んでいるときに気づいたことの1つは、パーティション分割(マップの後、リデュースの前)で魔法が発生することです。

このペーパーではhash(key) mod R分割の例として使用していますが、これは中間データを異なる削減タスクに分割する唯一の方法ではありません。

境界条件を@Yuval F回答に追加して完全にしてください。min(S)とmax(S)が、サンプリングされたキーの中で最小のキーと最大のキーであるとします。すべてのキー<min(S)は、1つのreduceタスクに分割されます。逆の場合も、すべてのキー> = max(S)は、1つの削減タスクに分割されます。

最小値や最大値など、サンプリングされたキーにハード制限はありません。ただ、これらのRキーがすべてのキーに均等に分散されるほど、この分散システムはより「並列」になり、reduceオペレーターがメモリオーバーフローの問題を起こす可能性は低くなります。


0

推測しています...

膨大なデータセットがある場合、データをいくつかのチャンクに分割して並列処理します(おそらくレコード番号、つまりレコード1-1000 =パーティション1などによって)。

各パーティションをクラスター内の特定のノードに割り当て/スケジュールします。

各クラスターノードは、パーティションを独自のミニパーティションにさらに分割(マップ)します。したがって、パーティション1で、Aで始まるすべてのものを取得し、xのミニパーティションAに出力します。現在A(x)が既に存在する場合は、新しいA(x)を作成します。xを連続番号に置き換えます(おそらく、これはそのためのスケジューラジョブです)。つまり、次のA(x)の一意のIDを教えてください。

マッパー(前のステップ)によって完了したジョブを「削減」クラスターノードに引き渡し(スケジュール)します。ノードクラスターを削減すると、各A(x)パーツの並べ替えがさらに絞り込まれ、マッパータスクがすべて実行された場合にのみ発生します(Aで始まるすべての単語の並べ替えを実際に開始することはできません)。作成中の別のAミニパーティションになります)。結果を最後のソートされた部分に出力します(つまり、ソート済みA、ソート済みBなど)

完了したら、並べ替えられたパーティションを1つのデータセットに再度結合します。この時点では、n個のファイルを単純に連結しただけです(A〜Zだけを実行している場合は、nは26になる可能性があります)など。

間に中間のステップがあるかもしれません...私はわかりません:)。つまり、最初の削減ステップの後で、さらにマップして削減します。

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