MapReduceの目新しさは何ですか?


68

数年前、MapReduceは分散プログラミングの革命として歓迎されました。批評家もいましたが、概して熱狂的な誇大宣伝がありました。それも特許を取得しました![1]

名前が連想させるmapreduce関数型プログラミングでは、私が読んだとき(ウィキペディア)

マップステップ:マスターノードは入力を受け取り、それをより小さなサブ問題に分割し、ワーカーノードに配布します。ワーカーノードがこれを順番に繰り返して、マルチレベルツリー構造になります。ワーカーノードは小さな問題を処理し、その応答をマスターノードに返します。

削減ステップ:マスターノードはすべてのサブ問題への回答を収集し、それらを何らかの方法で組み合わせて出力を形成します。これは元々解決しようとしていた問題への回答です。

または[2]

MAPの内部: [...] MAPは入力値を単語に分割します。[...] MAPは、入力の指定された各キー/値ペアを潜在的に多くの中間キー/値ペアに関連付けることを目的としています。

REDUCEの内部: [...] [REDUCE]は、命令集約(たとえば、削減)を実行します。多くの値を取得し、それらを単一の値に削減します。

私は仕方がありません。これは、Mergesortの意味での分割と征服であり、単純で単純です!それで、MapReduceに(概念的な)目新しさはどこかにありますか、それとも特定のシナリオで役立つ古いアイデアの新しい実装ですか?


  1. 米国特許7,650,331:「効率的な大規模データ処理のためのシステムおよび方法」(2010)
  2. GoogleのMapReduceプログラミングモデル— R.Lämmelによる再訪(2007)

7
目新しさはありません。これを答えにするつもりはありませんが、MapReduceによって新しい計算や分散コンピューティングさえ発見されなかったというのが私の強い意見です。
edA-qa mort-ora-y

@Aryabhata:新規性がある場合、この質問には良い建設的な答えがあります。存在しない場合、それを証明するものはほとんどありません(おそらく、MapReduceを明示的に古い手法に縮小することを除く)、trueです。しかし、そのように感じたら、ぜひ投票してください!
ラファエル

@ edA-qamort-ora-y:その場合、古い用語でMapReduceを表現できるはずです。それは良い答えになるでしょう!
ラファエル

1
@Raphael、私は同意しますが、それができるかどうかはわかりません。ただし、ここ(最初の引用)で説明したように、マージソートではmap / reduceの正確な方法が使用されます。実際、変更なしで配布できます。
edA-qa mort-ora-y

回答:


47

考えずにはいられません。これは、分断と征服であり、単純明快です!

M / Rは分割統治ではありません。前の入力の小さなサブセットにアルゴリズムを繰り返し適用することは含まれません。パイプライン(より単純な関数の構成として指定された関数)は、パイプラインステージがmap操作とreduce操作を交互に実行するパイプラインです。さまざまな段階でさまざまな操作を実行できます。


それで、MapReduceには(概念的な)斬新さがありますか、それとも特定のシナリオで有用な古いアイデアの新しい実装ですか?

MapReduceは、計算理論の新境地を開くことはありません。問題をより単純な操作に分解する新しい方法を示していません。特定のクラスの問題に対して、特定の単純な操作が実用的であることを示しています。


MapReduceの論文の貢献はしました

  1. 特定の問題に対して効率的かつフォールトトレラントに分散できる、よく理解されている2つの直交演算子のパイプラインを評価する:大きなコーパスのテキストインデックスを作成する
  2. その問題についてmap-reduceのベンチマークを行い、ノード間で転送されるデータ量と、ステージのレイテンシの違いが全体のレイテンシにどのように影響するかを示します
  3. 計算中のマシン障害を自動的に補償できるようにシステムをフォールトトレラントにする方法を示します。
  4. 特定の有用な実装の選択と最適化を識別する

一部の批評はこれらのクラスに分類されます。

  1. 「Map / reduceは計算理論の新境地を開くことはありません。」本当です。元の論文の貢献は、特定の最適化セットを備えたこれらのよく知られた演算子を使用して、実際の問題を1回限りのソリューションよりも簡単かつフォールトトレラントに解決することに成功したことです。
  2. 「この分散計算は、マップに簡単に分解して操作を削減することはできません」。結構ですが、多くの人はそうです。
  3. 「n個のmap / reduceステージのパイプラインには、結果が生成される前にパイプラインのreduceステップの数に比例したレイテンシが必要です。」おそらく本当です。reduceオペレーターは、完全な出力を生成する前にすべての入力を受け取る必要があります。
  4. 「このユースケースでは、Map / reduceは過剰です。」多分。エンジニアが光沢のある新しいハンマーを見つけると、彼らは釘のように見えるものを探しに行く傾向があります。それは、ハンマーが特定のニッチに適したツールではないという意味ではありません。
  5. 「Map / reduceは、リレーショナルDBの代替としては不十分です。」本当です。リレーショナルDBがデータセットに合わせて拡張できる場合、それは素晴らしいことです。オプションがあります。

まあ、彼らは元の紙を「セミナ」と呼んでいるので、私は何か新しいものを期待しています。私はあなたの最初の段落を受け取りません:明らかに、分割と征服ではないアルゴリズム技術がたくさんあります。MapReduceが特定の問題セットに対するd&cの「唯一の」効率的な実装である場合、アルゴリズム(imho)独創的または特許価値のあるものではありません。それは良いシステムではないと言っているわけではありません。私の批評は、コミュニティによる受け入れよりもMapReduce自体に対するもののほうが少ないことに注意してください(それが目的に合っていると思います)。
ラファエル

1
@ラファエロ、私はあなたがリンクしているという意味でM / Rが分裂して征服するとは思いません。元の入力のより小さなサブセットにアルゴリズムを繰り返し適用することは含まれません。パイプラインステージは、マップ操作と削減操作を交互に行うパイプラインです。
マイクサミュエル

ほんと。「ワーカーノードがこれを順番に繰り返し、マルチレベルのツリー構造につながる可能性がある」と解釈しました。この方法ですが、もちろん、すべてのレベルで同じことが起こることを意味するわけではありません。
ラファエル

1
@ ex0du5、あなたはそれがしない主張のためにそれを非難するかもしれないと思う。「多くのシステムは制限されたプログラミングモデルを提供し、制限を使用して計算を自動的に並列化しました。... MapReduceは、大規模な実世界の計算の経験に基づいて、これらのモデルの簡略化と蒸留と見なすことができます。 、ほとんどの並列処理システムは小規模でのみ実装されており、マシン障害の処理の詳細はプログラマーに任されています。」ラビンとヴァリアントの論文を引用していますが、リスコフの論文は引用していません。
マイクサミュエル

1
@ ex0du5、まあまあ。「「Map / reduceは計算理論の新境地を開くことはない」と思った。本当だ。」十分に明確でしたが、投稿のリストを書き直しました。
マイクサミュエル

21

編集(2014年3月)それ以来、MapReduceタイプの計算モデルのアルゴリズムにもっと取り組んできたと言っておくべきです。以下でお話しするDivide-Compress-Conquerテクニックは驚くほど多用途であり、非自明で興味深いと思うアルゴリズムの基礎になる可能性があります。


包括性の観点からはマイクよりはるかに劣るが、計算/アルゴリズム理論の観点からの答えを提供させてください。

O(nϵ)o(logn)

O(1)

  • 問題のインスタンスをパーティション化します(多くの場合、ランダムに)
  • 各パーティションでいくつかの計算を並列に実行し、計算結果をコンパクトに表します
  • コンパクトに表現されたすべてのサブ問題ソリューションを単一のプロセッサで結合し、そこで計算を終了します

nO(n)n

さて、これは実際には分割と征服の面白いひねりだと思います。ひねりは、分割段階の後、単一のプロセッサが征服できるようにサブ問題ソリューションを圧縮する必要があることです。ただし、これがこれまでに考え出した唯一の手法のようです。たとえば、疎接続などの疎グラフの問題で失敗します。これをストリーミングモデルと比較すると、FlajoletとMartinの巧妙なサンプリングアルゴリズム、MisraとGriesの決定論的なペアリングアルゴリズム、簡単なスケッチテクニックのパワーなど、新しいアイデアがたくさん生まれました。

プログラミングパラダイムとして、map reduceは非常に成功しています。私のコメントは、map reduceを興味深い計算モデルと考えています。優れた理論モデルは少し奇妙です。それらが現実に近づきすぎると扱いにくくなりますが、より重要なのは、(機械学習から用語を借りるために)定性があまりに具体的なモデルは一般化しない、つまり他のモデルでは成り立たないということです。だからこそ、新しいアルゴリズムを思い付くために私たちに挑戦するのに十分なだけ残しながら、できるだけ多くの詳細を抽象化したいのです。最後に、これらの新しいアイデアは、最終的に現実の世界に戻る方法を見つけることができるはずです。PRAMは興味深いアイデアにつながる非現実的なモデルの1つですが、これらのアイデアは現実世界の並列計算にほとんど適用できないことが判明しました。一方、ストリーミングも非現実的であり、しかし、実際の世界で実際に採用されているアルゴリズムのアイデアに影響を与えました。見るカウントミニスケッチ。スケッチ手法は、実際にはマップリデュースに基づいたシステムでも使用されています。


おそらく、M / RはPRAMやストリームよりも現実的な(有用な)モデルです。(少なくともいくつかのかなり大きな問題については。)
Xodarap

「単一のプロセッサが征服できるように、サブ問題ソリューションを圧縮する必要があります」-M / Rによって解決できる問題のセットは、扱いやすいキャッシュ対応またはキャッシュが存在する問題のサブセットであると言っているようです-忘却のソリューション。そうだとすれば、このステートメントはほとんどの分散計算スキームに等しく適用されると思われます。
マイクサミュエル

1
@Xodarapかもしれません。ここでは、純粋にアルゴリズム理論の観点を使用しています。モデルは、新しいアルゴリズムの観点につながる場合に役立ちます。その手段によって、ストリーミングは完全に現実的ではありませんが、実際に実際に役立つ多数の新しい技術につながりました。ポイントは、新しい考え方につながる正しい抽象化とは何かということです。現在のMRの抽象化には、さまざまな成功があります(ただし、ある程度の成功はあると思います)
Sasho Nikolov

1
@MikeSamuelその文の「必要」は、これがテクニックが機能するために必要なものであることを意味します。それが唯一可能なことではありません。私が知っているMRの理論的な否定的な結果はありません。私の不満は、MRが厳密にCOよりも強力ではないということではありません。モデルに触発された新しいアルゴリズム的思考をあまり見ていません(システムには適していますが、計算モデルには失望します)。一方キャッシュ遺却自体に素晴らしいアイデアは芋です
Sashoニコロフ

@SashoNikolov、わかりました。説明してくれてありがとう。
マイクサミュエル

6

私はあなたに完全に同意します。概念的な観点から見ると、本当に新しいものは何もありません。Map/ Reduceは元々、Parallel Computingではデータフロープログラミングモデルとして知られていました。ただし、実用的な観点からは、Googleが提案するMap / Reduceおよびその後のオープンソース実装もクラウドコンピューティングを活性化し、非常に単純な並列分解および処理で非常に人気があります。もちろん、複雑なドメインまたは機能の分解を必要とする他のものにはあまり適していません。


3

あなたはコメントで頭を釘付けにしたと思います。

関数型言語でマップを並列化できるというのは正しくありません。言語は純粋でなければなりません。(Haskellは、漠然と主流の純粋に機能的な唯一の言語だと思います。Lisp、OCaml、Scalaはすべて純粋ではありません。)

エンジニアが最初にプロセッサをパイプライン化したときのタイムシェアリングの前から、純粋なコードの利点について知っていました。それでは、どうして誰も純粋な言語を使用しないのでしょうか?

それは本当に、本当に、本当に難しいです。純粋な言語でのプログラミングは、多くの場合、両手を背中の後ろで縛ったプログラミングのように感じます。

MRが行うことは、純度の制約をいくぶん緩和し、他の部分(シャッフルフェーズなど)のフレームワークを提供して、大部分の問題に対して配布可能なコードを非常に簡単に記述できるようにすることです。

NC=P


私はMapReduceに精通していませんが、あなたのプレゼンテーションは、前世紀のParallelism 101で理想的なケースとして提示されたことを覚えているものと変わらないようです。
ジル 'SO-悪であるのをやめる

@Gilles:私の意図は、単に「分割して征服する」!=「分配可能な分割して征服する」ことを示すことでした。M / Rはそれほど重要ではありませんが、おそらくまだオリジナルではありません。
Xodarap

関数型プログラミングでは、すべてのマップを並列化(驚くほど)できるので、そのパラダイムに固執しないのはなぜですか?count擬似コードでシェア変数がどのように表示されるかわかりません。単に現在の値を渡すだけでdo_something動作するはずです。(呼び出しが発行された後)再帰呼び出しが相互に依存する「実際の」d&cアルゴリズム(Mergesort、Quicksortなど)の例を挙げていただけますか?
ラファエル

@Raphael:あなたのコメントによりよく答えられるように、答えを書き直しました。必要に応じて、純度が面倒な場合の例を追加できます。
Xodarap

1
@Raphael:M / Rを使用してプログラミング時間がX時間からYに低下すること、または純度を強制することでAからBに増加することを示す論文を引用できれば、答えがはるかに良いことに同意しますが、できることはすべてできると思います私の手は猛烈に振って、違いは取るに足らないものだと主張しています。
Xodarap
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.