Google は、2003 年から 2006 年にかけて、非常に影響力のある 3 つの記事を連続して公開しました。つまり、2003 年に SOSP でリリースされた GFS、2004 年に OSDI でリリースされた MapReduce、そして 2006 年に OSDI でリリースされた BigTable です。 GFS はファイル システムに関連しており、その後の分散ファイル システム設計の指針となる重要性を持っています。MapReduce はジョブ スケジューリングに使用される並列コンピューティング プログラミング モデルであり、BigTable は GFS や Chubby などの Google テクノロジーに基づいて構築されています。 、SSTableなどGoogle 検索、Google Earth、Google Analytics など、かなりの数の Google アプリケーションがこれら 3 つのテクノロジーを使用しています。したがって、これら 3 つのテクノロジーを総称して、Google テクノロジーの「三種の神器」と呼ばれます。今日もD Gua GeはMapReduceで「料理の仕事」を頑張っています!
MapReduce の概要
MapReduce は、非常に大規模なデータ セットを処理および生成するためのプログラミング モデルおよびアルゴリズム モデルの関連実装です。ユーザーはまず、キーと値のペアに基づいてデータセットを処理する
Map 関数を作成し、キーと値のペアに基づいて中間データセットを出力します。次に、
がすべてのデータセットを同じデータセットにマージする Reduce 関数を作成します。中間キー値の中間値。
百聞は一見にしかず。MapReduce を説明するために絵を使ってみましょう:
プログラミングの実践
ことわざにあるように、「実践は真の知識をもたらします」。それがラバなのか馬なのかは、散歩に連れ出さないとわかりません。したがって、この原理を本当に理解したい場合は、自分でコードを書いて実践するのが最善です。
最近、私は数人の友達と JavaScript を学んでいるので、JavaScript にもっと注目しています。昨日インターネットを徘徊していたら、JavaScriptでMapReduceアルゴリズムを実装したすごい人がいることに驚きました。次に、それを皆さんと共有し、同時に私自身の紹介文を追加して、皆さんが MapReduce を理解できるようにしたいと考えています。具体的なコードの実装は次のとおりです。
var Job = {
//処理対象のデータ
data : [
「ここでお会いできてうれしいです。このサイトは、詩と、詩を可能にする人々に捧げられています。」、
"、
" 詩人とその読者。FamousPoetsAndPoems.com は"、
"私たちのサイトで、631 人以上の詩人による大規模な詩と引用のコレクションを見つけることができます。 、
「詩を読んで楽しんでください」、
「私もアメリカを歌います」、
「私は闇の兄弟です」、
「キッチンで食事をするように送られます」、
「会社が来るとき」、
「でも笑うよ」、
「よく食べて」、
「そして強くなる」、
「明日」、
「テーブルに着くよ」 "、
「会社が来たら」、
「誰も勇気がない」、
「言ってください」、
「キッチンで食べてください」、
「それから」、
「ほかにも」 "、
「彼らは私がどれほど美しいかを見るでしょう」、
「そして恥じてください」、
「私もアメリカです」
]、
//それぞれを分離データ内のスペースを含む文字列の行 Open、
// そして、それを {key: word, value: 1} の形式のオブジェクトに「再編成」し、オブジェクト配列を返します
map : function(line) {
var splits = line.split(" ");
var temp = [];
for(var i=0; i
temp.push( {key : splits[i], value : 1} );
}
return temp;
},
//各単語が「data」に出現する回数を計算します
reduce : function(allSteps) {
var result = {};
for(var i=0; ivar step = allSteps[i]; step.key] = result[step.key] ? (result[step.key] 1) : 1;
}
// 初期化運用のポイント。
init : function() {
var allSteps = [];
for(var i=0; i//複数のスレッドを呼び出すことができる場合ここでは Job.map 関数がさらに現実的です。 ? ?
allSteps = allSteps.concat(Job.map(Job.data[i]));
}
//唯一の欠点は、Job.reduce 関数を複数のスレッドから呼び出すことができないことです。 ?
var result = Job.reduce(allSteps)
console.log(JSON.stringify(result))
}
}; // ジョブ
//
ジョブの実行を開始します.init();
これらのコードをコピーしてブラウザーのコンソール (コンソール) に直接貼り付けるか、HTML ファイルに入れてブラウザーで開きます。コンソール出力で次の効果を確認できます:
軟膏の欠陥
この記事が公開された後、一部のネチズンは「マルチスレッドすら持たない JS にどのような MapReduce ができるのか?」と怒鳴りました。D Gua 兄弟は、こんな質問もされていますこのコードの説明を見た後、D Gua 兄弟は、JavaScript は単一のプロセスではないのではないかと疑問に思いました。 MapReduce をシミュレートするにはどうすればよいでしょうか?コードを注意深く読んでシングルステップのデバッグを行った結果、D Gua Ge 氏の見解がさらに裏付けられました。 (D Gua Ge に関する質問はコード内でコメント化されています。)
しかし、よく考えてみると、これらは MapReduce の原理の理解に影響を与えません。これは 1 つのプロセスにすぎず、最も基本的なバージョンです。まずこれを理解すると、マルチスレッド プロセス全体を理解しやすくなるかもしれません。
続きます
実際、D 兄弟は現在、この例に基づいて Java を使用してマルチスレッド バージョンを実装することを検討しています。これにより、シミュレートされた MapReduce がより現実的になります。 D Gua 兄弟はいくつかの問題を明確に検討した後、コードを送信します。乞うご期待!