web-dev-qa-db-ja.com

良いMapReduceの例

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

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

193
pagid

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

たとえば、SQLでは、生年月日を指定して、100万レコードに対して30歳以上の年齢の人が見つけるのにはしばらく時間がかかりますが、クエリの複雑さが増すと拡大順にしか増えません。 Map Reduceは、データが分散方式で処理されるクラスタベースの実装を提供します。

これが何を説明しているかについてのウィキペディアの記事です map-reduceはすべてについてのものです

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

個人的には、 このリンク という概念を理解するのに非常に役立ちます

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

友達を探す

MapReduceはもともとGoogleで開発されたフレームワークであり、これを使用すると、多数のドメインにわたって簡単に大規模な分散コンピューティングを行うことができます。 Apache Hadoopはオープンソースの実装です。

詳細は説明しませんが、それは2つの関数を定義することになります。それはマップ関数とリデュース関数です。 map関数は値を取り、キーと値のペアを出力します。たとえば、文字列を取り、Wordの長さをキーとして、Word自体を値として出力するmap関数を定義すると、map(steve)は5:steveおよびmap(savannah)は8:savannahを返します。 。 map関数はステートレスであり、出力値を計算するために入力値だけが必要であることに気付いたかもしれません。これにより、map関数を値に対して並列に実行することができ、大きな利点があります。 reduce関数に入る前に、mapreduceフレームワークはすべての値をキーでグループ化します。したがって、map関数が次の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の最も一般的な例は、コーパス内で単語が出現する回数を数えることです。あなたがインターネットのコピーを持っていたとしよう(私はそのような状況で働いているのに幸運だった)、そしてあなたはインターネット上のすべてのWordのリストとそれが何回発生したかを望んでいた。

あなたがこれに近づく方法は、あなたが持っている文書をトークン化し(単語に分解し)、そして各Wordをマッパーに渡すことです。マッパーはそれから1の値と共にWordを吐き出します。グループ化段階ではすべてのキー(この場合は単語)を取り、1のリストを作成します。次に、reduceフェーズはキー(Word)とリスト(キーがインターネットに表示されるたびに1のリスト)を取り、リストを合計します。そして、減数器はその数と共にWordを出力します。すべてのことが言われ終わったら、あなたはそれが何回出現したかと共に、インターネット上のすべてのWordのリストを持つでしょう。

簡単でしょ? mapreduceについて読んだことがあるなら、上記のシナリオは新しいものではありません。それはmapreduceの「こんにちは、世界」です。実際のユースケースはここにあります(Facebookは実際には次のことを行っても行わなくてもかまいません。これは単なる例です)。

Facebookには友達のリストがあります(友達はFacebook上では双方向のものです。私があなたの友達の場合、あなたは私のものです)。また、多くのディスク容量があり、毎日何億もの要求を処理します。彼らは、要求の処理時間を短縮することができるときに計算を事前計算することにしました。一般的な処理要求の1つは、「あなたとJoeに230人の友人が共通している」という機能です。誰かのプロフィールにアクセスすると、あなたが共通している友人のリストが表示されます。このリストは頻繁には変更されないので、プロファイルを訪れるたびに再計算するのは無駄です(きちんとしたキャッシュ戦略を使うことはできますが、この問題についてmapreduceを書き続けることはできません)。私たちは一日一回みんなの共通の友達を計算してそれらの結果を保存できるようにmapreduceを使うつもりです。後でそれはただの素早い検索です。我々はたくさんのディスクを持っています、それは安いです。

友達がPerson - > [List of Friends]として保存されているとします。

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((A B) - >(A C D E)(B C D))は(A B):(C D)を出力し、友人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)がいることがわかります。

276
karthikr

Hadoop風のMapReduce実装の最も良い例の1つ

ただし、それらはMapReduceアイデアのキーバリューベースの実装に限定されていることに注意してください(したがって、それらは適用性を制限しています)。

22
Nikita Ivanov

MapReduceで実行できるよく知られた操作のセットは、通常のSQL操作のセットです(SELECT、SELECT WHERE、GROUP BY、ect)。

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

3
guyrt

私は時々MRの概念を人々に提示します。私は、処理タスクが人々によく知られていることを見つけ、それをMRパラダイムにマッピングします。

通常私は二つのことを取ります:

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

  2. 2つのテーブルを結合します。 DBを扱う人々はその概念とそのスケーラビリティの問題に精通しています。 MRでそれがどのようにできるかを示してください。

2
David Gruzman