適切なMapReduceの例[終了]


202

「MapReduceを使用して長いテキストの単語を数える方法」タスク以外の良い例は考えられませんでした。これは、このツールがどれほど強力であるかを他の人に印象付けるための最良の例ではないことがわかりました。

私はコードスニペットを探しているのではなく、単に「テキスト」の例を探しています。


1
私は、似ているがはるかに優れた例は、コンピューター上にあるすべてのテキストファイルの単語を数えることだと思います。MapReduceの機能を理解し、実証するのは簡単です。
Peter Lee

5
私が検索した最後の4つの質問まで、これらの質問はこのサイトでは非建設的であることがわかりました。幸運なことに、彼らはすでに答えを持っています。著者に感謝の意を表明し、現在のところ、閉鎖方針を理解していない80人以上の個人がいました。それは他の人にとって重要なことではありませんが、80年代の初めから私はプロのプログラマーであり、今では自分が間違った質問をしているのに気づきました:)
Helder Velez

1
MapReduceのデザインパターンを確認することは価値があります。たとえば、これらのスライドでカバーされているものなど、この本
Denis

回答:


297

マップリデュースは、大量のデータを効率的に処理するために開発されたフレームワークです。たとえば、データセットに100万件のレコードがあり、それがリレーショナル表現で保存されている場合、値を導き出し、これらに対して何らかの種類の変換を実行するのは非常にコストがかかります。

SQLの例では、生年月日を指定して、100万件のレコードで30歳を超える人の数を調べるにはしばらく時間がかかりますが、これは、クエリの複雑さが増すと、マグニチュートの順に増加するだけです。Map Reduceは、データが分散して処理されるクラスターベースの実装を提供します

ここにすべてが何であるかを説明するウィキペディアの記事map-reduceがあります

別の良い例は、map reduceを使用して友達を見つけることが、概念を理解するための強力な例であり、よく使用されるユースケースです。

個人的には、このリンクは概念を理解するのに非常に役立つことがわかりました

ブログで提供されている説明のコピー(リンクが古くなる場合)

友達を探す

MapReduceは、もともとGoogleで開発されたフレームワークであり、多数のドメインにまたがる大規模な分散コンピューティングを容易にします。Apache Hadoopはオープンソースの実装です。

詳細については説明しますが、2つの関数を定義することになります。それは、map関数とreduce関数です。map関数は値を取り、キーと値のペアを出力します。たとえば、文字列を取り、キーとして単語の長さを、値として単語自体を出力するマップ関数を定義すると、map(steve)は5:steveを返し、map(savannah)は8:savannahを返します。 。map関数はステートレスであり、出力値を計算するために入力値のみを必要とすることに気づいたかもしれません。これにより、値に対してマップ関数を並行して実行できるようになり、大きな利点が得られます。reduce関数に到達する前に、mapreduceフレームワークはすべての値をキーごとにグループ化するため、マップ関数が次のkey:valueペアを出力する場合:

3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research

それらは次のようにグループ化されます。

3 : [the, and, you]
4 : [then, what, when]
5 : [steve, where]
8 : [savannah, research]

これらの各行は、キーと値のリストを受け入れるreduce関数に引数として渡されます。この例では、特定の長さの単語がいくつ存在するかを調べようとしている可能性があるため、reduce関数はリスト内の項目の数を数え、リストのサイズのキーを次のように出力します。

3 : 3
4 : 3
5 : 2
8 : 2

削減も並行して行うことができ、これも大きな利点です。次に、これらの最終結果を見て、コーパスに長さ5の単語が2つだけあることなどを確認できます。

mapreduceの最も一般的な例は、コーパス内で単語が出現する回数をカウントすることです。あなたがインターネットのコピーを持っているとします(私はそのような状況で働くことができて幸運でした)、あなたはインターネット上のすべての単語とそれが発生した回数のリストが必要でした。

これに取り組む方法は、持っているドキュメントをトークン化し(単語に分解)、各単語をマッパーに渡すことです。次に、マッパーは次の値とともに単語を吐き出します。1。グループ化フェーズでは、すべてのキー(この場合は単語)を取得し、1のリストを作成します。次に、reduceフェーズは、キー(単語)とリスト(キーがインターネット上に表示されるたびに1のリスト)を受け取り、リストを合計します。次に、レデューサーは単語とそのカウントを出力します。すべての発言が完了すると、インターネット上のすべての単語のリストと、その単語が出現した回数が表示されます。

簡単ですよね?mapreduceについて読んだことがあれば、上記のシナリオは新しいものではありません... mapreduceの「Hello、World」です。これが実際の使用例です(Facebookが実際に次のことを行う場合と行わない場合があります。これは単なる例です)。

Facebookには友達のリストがあります(友達はFacebookで双方向のものであることに注意してください。私があなたの友達なら、あなたは私のものです)。また、大量のディスク容量があり、毎日数億のリクエストに対応します。リクエストの処理時間を短縮できる場合は、事前に計算を行うことを決定しました。一般的な処理要求の1つは、「あなたとジョーには230人の共通の友達がいる」機能です。誰かのプロフィールにアクセスすると、共通の友達のリストが表示されます。このリストは頻繁に変更されないため、プロファイルにアクセスするたびに再計算するのは無駄です(まともなキャッシュ戦略を使用できることを確認してください。しかし、この問題のためにmapreduceについて書き続けることはできません)。mapreduceを使用して、全員を計算できるようにします。s共通の友達が1日に1回、その結果を保存します。後でそれはただのクイックルックアップです。私たちはたくさんのディスクを持っています、それは安いです。

友達がPerson-> [友達のリスト]として保存されているとすると、友達リストは次のようになります。

A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D

各行はマッパーへの引数になります。友達リストのすべての友達について、マッパーはキーと値のペアを出力します。鍵は本人と友達になります。値は友達のリストになります。キーはソートされて友達が順番に並べられ、友達のすべてのペアが同じリデューサーに移動します。これはテキストでは説明するのが難しいので、パターンを確認できるかどうかを確認してみましょう。すべてのマッパーの実行が完了すると、次のようなリストが作成されます。

For map(A -> B C D) :

(A B) -> B C D
(A C) -> B C D
(A D) -> B C D

For map(B -> A C D E) : (Note that A comes before B in the key)

(A B) -> A C D E
(B C) -> A C D E
(B D) -> A C D E
(B E) -> A C D E
For map(C -> A B D E) :

(A C) -> A B D E
(B C) -> A B D E
(C D) -> A B D E
(C E) -> A B D E
For map(D -> A B C E) :

(A D) -> A B C E
(B D) -> A B C E
(C D) -> A B C E
(D E) -> A B C E
And finally for map(E -> B C D):

(B E) -> B C D
(C E) -> B C D
(D E) -> B C D
Before we send these key-value pairs to the reducers, we group them by their keys and get:

(A B) -> (A C D E) (B C D)
(A C) -> (A B D E) (B C D)
(A D) -> (A B C E) (B C D)
(B C) -> (A B D E) (A C D E)
(B D) -> (A B C E) (A C D E)
(B E) -> (A C D E) (B C D)
(C D) -> (A B C E) (A B D E)
(C E) -> (A B D E) (B C D)
(D E) -> (A B C E) (B C D)

各行は、レデューサーへの引数として渡されます。reduce関数は単純に値のリストと交差し、交差の結果と同じキーを出力します。たとえば、reduce((AB)->(ACDE)(BCD))は(AB):(CD)を出力し、友人AとBが共通の友人としてCとDを持っていることを意味します。

削減後の結果は次のとおりです。

(A B) -> (C D)
(A C) -> (B D)
(A D) -> (B C)
(B C) -> (A D E)
(B D) -> (A C E)
(B E) -> (C D)
(C D) -> (A B E)
(C E) -> (B D)
(D E) -> (B C)

DがBのプロファイルにアクセスする(B D)と、すぐに調べて、3人の共通の友人がいることを確認できます(A C E)


4
もう1つの例は、世界中の気象データを分析することです。特定の地域の最大と最小を見つける。これは非常に良い例です。
rvphx 2013

これらの中間タプルをすべて生成し、後ですべての交差をチェックするのは、面倒ではありませんか。AB AC BCなど、考えられるすべてのフレンドペアを生成し、これらのペアを、フレンドリスト全体とともに、ペアの2人のフレンドだけを特定のマシンに渡して、交差を計算させた方がいいのではないでしょうか。ここで何が欠けていますか?
GrowinMan

8
AがEのプロファイルにアクセスした場合はどうなりますか?彼らには共通の友人がいますが、最終結果には(A、E)はありません。
ピンチ

1
@ピンチは、AとE自体が友達ではないためです。(あなたがAまたはEは非友人のための彼らのfriendlist :)隠すことができることを考慮していない限り)その場合には、このアプローチは確かに不十分なようだ
Pega88

1
@karthikr:グループ化フェーズについて混乱しています。MapとReduceは明らかに並行して実行できますが、グループ化フェーズはどうですか?シングルスレッドで実行する必要がありますか、それとも何か不足していますか?
Dinaiz

24

Hadoopに似たMapReduce実装の最良の例の1つ

ただし、これらはMapReduceアイデアのキー値ベースの実装に限定されている(したがって、適用範囲が限定されている)ことに注意してください。


あなたが正しいです。しかし、現実世界の問題のほとんどは、キー値ベースであるか、またはキー値パラダイムに変換できる/すべきです。
Saisumanth Gopisetty

4

MapReduceで実行できるおなじみの操作のセットの1つは、SELECT、SELECT WHERE、GROUP BYなどの通常のSQL操作のセットです。

別の良い例は、行列乗算です。ここでは、Mの1行とベクトル全体xを渡して、M * xの1つの要素を計算します。


3

時々私は人々にMRの概念を提示します。私は人々に馴染みのある処理タスクを見つけ、それをMRパラダイムにマッピングします。

通常、私は2つのことを行います。

  1. グループ化/集計。ここで、シャッフルステージの利点は明らかです。シャッフルも分散ソートであるという説明+分散ソートアルゴリズムの説明も役立ちます。

  2. 2つのテーブルを結合します。DBを扱う人々は、その概念とそのスケーラビリティの問題に精通しています。MRでそれを行う方法を示します。


非オタクに拡張するには、私は子供たちの方法を使用します:あなたは熱心な子供たちの束と多くの多くのカードを持っています。あなたは、各子供にカード*デッキの後ろ、番号/写真、そしてスーツの順でソートするように指示するカードの量を与えます。つまり、マップ機能は各子供が終了し、割り当てられた大人のセットに一度に2つずつ持ち込みます。各大人は、山を1つの山に「減らし」、次に2人の大人それぞれが無料の大人にカードスタックを渡します。つまり、キッズ/スタックの数に応じて、複数回実行できるreduce関数です。ほとんどの人が最初の試みでそれを手に入れます
ミッキー・ペルスタイン16/07/27
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.