5

http://en.wikipedia.org/wiki/MapReduceでmapreduce を読み、多くの「ドキュメント」で「単語」の数を取得する方法の例を理解しました。ただし、次の行がわかりませんでした。

したがって、MapReduce フレームワークは (キー、値) ペアのリストを値のリストに変換します。この動作は、関数型プログラミングの map と reduce の組み合わせとは異なります。これは、任意の値のリストを受け入れ、map によって返されるすべての値を組み合わせた 1 つの値を返します。

誰かがもう一度違いを詳しく説明できますか (MapReduce フレームワーク VS マップとリデュースの組み合わせ)? 特に、reduce 関数型プログラミングは何をするのでしょうか?

どうもありがとう。

4

3 に答える 3

8

主な違いは、MapReduceが明らかに特許性があることです。(自分自身を助けることができませんでした、ごめんなさい...)

もっと深刻なことに、MapReduceの論文は、私が覚えているように、大規模に並列化された方法で計算を実行する方法論を説明しています。この方法論は、何年も前からよく知られているmap / reduce構造に基づいていますが、データの分散などの問題にとどまりません。また、で使用される関数によって操作および返されるデータの構造にいくつかの制約が課せられます。計算のmap-likeおよびreduce-like部分(キーと値のペアのリストに含まれるデータに関するもの)であるため、MapReduceは超並列処理に適した&の組み合わせの特殊化であると言えます。mapreduce

関数型プログラミングのmap/reduceコンストラクトにマップされている関数が入力ごとに1つの値を生成することについてのウィキペディアのコメントについては、確かにそうですが、ここでは、この値のタイプにまったく制約はありませんmap特に、 /reduce変換を再度適用するもののリストのような複雑なデータ構造である可能性があります。「単語のカウント」の例に戻ると、テキストの特定の部分について、mapドキュメント(または場合によってはドキュメントのチャンク)の出現回数に単語をマッピングするデータ構造を生成する関数を使用できます。 be)とreduce結果。

実際、それはまさにPhilHagelbergによるこの記事で起こっていることです。これは、Clojureで実装されたMapReduce-word-countingのような計算の面白くて非常に短い例であり、(ビット--はclojure.coreで実装されていますmap)と同等のものです。これとウィキペディアの例の唯一の違いは、カウントされるオブジェクトが任意の単語ではなくURLであるということです。それ以外は、とで実装された単語カウントアルゴリズムがあります。reduce(apply + (merge-with ...))merge-withreducemapreduce、MapReduceスタイル、そこにあります。MapReduceのインスタンスとして完全に認定されない可能性がある理由は、関連するワークロードの複雑な分散がないためです。それはすべて単一のボックスで発生しています...ボックスが提供するすべてのCPUではありますが。

関数の詳細な処理(reduce別名)については、 foldGrahamHuttonの「褶曲の普遍性と表現力に関するチュートリアル」を参照してください。これはHaskellベースですが、言語がわからなくても、Haskellのことを1つか2つ調べていく限り、読みやすくする必要があります... ++=リストの連結、深いHaskellの魔法はありません。

于 2010-01-23T04:48:20.847 に答える
1

単語数の例を使用すると、元の機能map()は一連のドキュメントを取得し、オプションでそのセットのサブセットを配布し、ドキュメントごとに、ドキュメント内の単語 (または特定の単語の出現) の数を表す単一の値を発行します。次に、機能reduce()は、すべてのドキュメントのグローバル カウントを、ドキュメントごとに 1 つずつ合計します。したがって、合計カウントが得られます (すべての単語または特定の単語のいずれか)。

MapReduce では、マップは各ドキュメントの各単語に対して (word, count) ペアを出力ます。次に、MapReduceは、各ドキュメント内の各単語の数を、それらを 1 つの山に混ぜずに合計します。したがって、カウントとペアになった単語のリストが得られます。reduce()

于 2010-01-23T03:42:31.340 に答える
1

MapReduce は、計算を並列化可能なマッパーとリデューサーに分割することを中心に構築されたフレームワークです。map と reduce というおなじみのイディオムに基づいて構築されています。独立した mapper と reducer でタスクを実行できるようにタスクを構造化できれば、MapReduce フレームワークを利用する方法でタスクを作成できます。

独立して計算できるタスクを認識し、それらをマッパーまたはリデューサー ノードにファームアウトする Python インタープリターを想像してみてください。あなたが書いた場合

reduce(lambda x, y: x+y, map(int, ['1', '2', '3']))

また

sum([int(x) for x in ['1', '2', '3']])

MapReduce フレームワークで機能的な map メソッドと reduce メソッドを使用することになります。現在の MapReduce フレームワークでは、より多くの配管が必要になりますが、それは同じ概念です。

于 2010-01-26T19:59:08.623 に答える