ブラウザでMap Reduce風味の並列分散処理

Preview:

DESCRIPTION

第3回KPF(Kumamoto Programming Freaks)で発表した資料です。

Citation preview

ブラウザでMapReduce風味の

偱分散(MapReduce JS + R)

shunsukshunsuk@in-action.net

第3回

KPF勉強会

2009.5.30

あじぇんだ• の生い ちについて(約2時間)• Googleの基盤技術&MapReduceとは• ブラウザでMapReduce風味– デモ(約2秒)– かんたんな説明

• Hadoopについて多くは語らない

プロフィール風味• shunsuk– http://in-action.net/shunsuk/– 医者を志す妻を応援する夫の日記

http://d.hatena.ne.jp/shunsuk/• 開発経験(抜粋)– Windows -> C#– Web -> Ruby on Rails– iPhone <- イマココ

• 三姉妹のパパ• 個人事業ニート

Googleの基盤技術&MapReduceについて

さらっと説明

Googleの基盤技術• Google File System (GFS)– 大規模分散ファイルシステム

• MapReduce– 大規模分散計算フレームワーク

• BigTable– 大規模分散データベース

• Chubby– 分散ロックサービス

MapReduceとは• Google– (2004 )– Google Research Publication: MapReduce

http://labs.google.com/papers/mapreduce.html

• フレームワーク– 超巨大データ– 偱分散

MapReduceとは• をMapとReduceに分ける• コード た うがわかりやすいかも

MapとReduce• ( )配偱の を2倍して合計

フツーに書くと。。。

result = 0[1, 2, 3].each { |x| result += x * 2 }

MapとReduce• ( )配偱の を2倍して合計

MapとReduceに分ける。

result = [1, 2, 3].map { |x| x * 2}.reduce { |x, y| x + y }

MapとReduceが 偱分散 できる。

※Rubyのバージョンによっては、reduceがありません。 かわりにinjectを使ってね。

Word Count• MapReduceのHello World• ドキュメント中の単語の出現数をカウント

Map• 単語を偱

map(String key, String value):// key: document name// value: document contentsfor each word w in value:EmitIntermediate(w, "1");

Reduce• 単語数を集計

reduce(String key, Iterator values):// key: a word// values: a list of countsint result = 0;for each v in values:result += ParseInt(v);Emit(AsString(result));

ブラウザでMapReduce風味

MapReduce JS + R• MapReduceっぽいことをブラウザで• 配布がカンタンかなと思ってさ• パフォーマンスについて、

とやかく言うのはヤボってもんだよ• 名前の由来– the end of genesis T.M.R. evolution turbo

type D からのインスピレーション(かもね)

DEMO• 実際に複数台のPCで動かしてみよう!• 今回は5台限定だよ!• iPhoneでも動くよ!

MapReduce JS + R• 実装– JavaScript– Ruby on Rails

• キーワード– Ajax– Comet風味

Nagare

Mapの前• Server -> Client

<“fruits”, “grape orange banana ...”>

Map• 市内某所、JavaScriptで

function map(key, value) {var words = value.split(" ");for (var i = 0; i < words.length; i++) {this.emit(words[i], "1");

}}

Mapの後• Client -> Server

<“grape”, “1, 1, 1, 1, ...”>,<“orange”, “1, 1, 1, 1, ...”>,<“banana”, “1, 1, 1, 1, ...”>

通信回数を減らしてみた

Shuffle• 実際は、Map -> Shuffle -> Reduce• キーごとに

<“grape”, “1, 1, 1, 1, 1, 1, 1, ...”>,<“orange”, “1, 1, 1, 1, 1, 1, 1, ...”>,<“banana”, “1, 1, 1, 1, 1, 1, 1, ...”>

Shuffle

Reduceの前• Server -> Client

<“grape”, “1, 1, 1, 1, 1, 1, 1, 1, ...”>

Reduce• 市内某所、JavaScriptにて

function reduce(key, value) {var count = Math.ceil(value.length / 2) + '';this.emit(key, count);

}

Reduceの後• Client -> Server

<“grape”, “128”>

CompleteComplete

grape : 128orange : 130banana : 116

設計とか実装とか

Ajax• 強引な数珠つなぎAjaxリクエスト

コールバックMapAjaxリクエスト

コールバックReduceAjaxリクエスト

コールバックComplete

Comet• サーバーからクライアントにイベント通知• 実装方法– コネクションを張りっぱなしにする

• サーバー– Tomcatなど

• Lingr– 傒したけど

Comet風味• WEBrick– 実はマルチスレッド– Railsはオプションで

• ActionController::Base.allow_concurrency = true• コネクション張りっぱなし– Thread.stop

Threadの停止と再開$mutex.synchronize {$threads << Thread.current

}Thread.stop

$mutex.synchronize {$threads.each do |t|t.run if t.status == 'sleep'

end$threads.clear

}

フレームワーク化• フレームワークがドメインロジックに

依存してはいけない• ドメインロジックは交換可能に

MapReduce JS + R Fx

WordCountController

WordCountViewMapReduceController

MapReduce.js

WordCountModel

※UMLじゃないよ (WordCountからMapReduceに矢印を引くのはNG)

MapとReduceは高階関数でfunction map(key, value) { ... }

function reduce(key, value) { ... }

function start() {var mapReduce = new MapReduce({

model: 'word_count',map: map,reduce: reduce

});mapReduce.start();

}

パラメータからModelの生成new Ajax.Request('/map_reduce/prepare',{method: 'post',parameters: ‘model=word_count'

});

model = eval(params[:model].classify).new

あのころの僕らに足りなかったもの

MapReduce「風味」• 足りてない– クライアント数に応じてスケール• 今回は5台固定

– 分散ファイルシステム• 今回はサーバーからドキュメントを配信

– タスク分配• 今回は決め打ち

– ストリームっぽさ&非同期っぽさ– 耐障害性

追伸

MapReduceの適用分野• ウ ブ のインデックス 成• データマイニング• 動ファイ ンス分析• バイオインフォマティクス• ログファイル分析• 教育、財務分析• 科学技術シミュレーション

Hadoop• GFSとMapReduceのクローン• オープンソース• Java製– 出 でいろんな言語OK

• Map/Reduce Toolkit (MRToolkit)– HadoopのRubyラッパー

Hadoop• Yahoo!の インデックス 成に 用• 「Amazon Elastic MapReduce」で 用

• 楽天のfairyは、MapReduceじゃないらしいよ

参考サイト• Google Research Publication: MapReduce

http://labs.google.com/papers/mapreduce.html

• MapReduce - naoyaのはてなダイアリーhttp://d.hatena.ne.jp/naoya/20080511/1210506301

• Radium Software Development http://www.radiumsoftware.com/0608.html#060831

参考書

読んでないけど。。。

MapReduce JS + R

• ソースコード– http://github.com/shunsuk/MapReduc

e-JS-R/– 現在、productionでしか動きません• ruby script/server –e production

おしまい。

ありがとうございました。

Recommended