「MapReduceを使用して長いテキストの単語を数える方法」タスク以外の良い例は考えられませんでした。これは、このツールがどれほど強力であるかを他の人に印象付けるための最良の例ではないことがわかりました。
私はコードスニペットを探しているのではなく、単に「テキスト」の例を探しています。
「MapReduceを使用して長いテキストの単語を数える方法」タスク以外の良い例は考えられませんでした。これは、このツールがどれほど強力であるかを他の人に印象付けるための最良の例ではないことがわかりました。
私はコードスニペットを探しているのではなく、単に「テキスト」の例を探しています。
回答:
マップリデュースは、大量のデータを効率的に処理するために開発されたフレームワークです。たとえば、データセットに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)
。
ただし、これらはMapReduceアイデアのキー値ベースの実装に限定されている(したがって、適用範囲が限定されている)ことに注意してください。
時々私は人々にMRの概念を提示します。私は人々に馴染みのある処理タスクを見つけ、それをMRパラダイムにマッピングします。
通常、私は2つのことを行います。
グループ化/集計。ここで、シャッフルステージの利点は明らかです。シャッフルも分散ソートであるという説明+分散ソートアルゴリズムの説明も役立ちます。
2つのテーブルを結合します。DBを扱う人々は、その概念とそのスケーラビリティの問題に精通しています。MRでそれを行う方法を示します。