ブラウザでmap reduce風味の並列分散処理

45
ブラウザMapReduce風味ధ偱分叀৶ (MapReduce JS + R) shunsuk [email protected] 3 KPF勉強会 2009.5.30

Upload: shinya-miyazaki

Post on 27-May-2015

2.757 views

Category:

Technology


0 download

DESCRIPTION

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

TRANSCRIPT

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

ブラウザでMapReduce風味の

偱分散(MapReduce JS + R)

[email protected]

第3回

KPF勉強会

2009.5.30

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

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

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

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

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

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

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

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

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

さらっと説明

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

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

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

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

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

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

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

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

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

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

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

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

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

フツーに書くと。。。

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

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

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

MapとReduceに分ける。

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

MapとReduceが 偱分散 できる。

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

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

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

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

Map• 単語を偱

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

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

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));

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

ブラウザでMapReduce風味

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

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

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

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

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

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

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

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

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

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

Nagare

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

Mapの前• Server -> Client

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

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

Map• 市内某所、JavaScriptで

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

}}

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

Mapの後• Client -> Server

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

通信回数を減らしてみた

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

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

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

Reduceの前• Server -> Client

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

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

Reduce• 市内某所、JavaScriptにて

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

}

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

Reduceの後• Client -> Server

<“grape”, “128”>

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

CompleteComplete

grape : 128orange : 130banana : 116

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

設計とか実装とか

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

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

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

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

コールバックComplete

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

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

• サーバー– Tomcatなど

• Lingr– 傒したけど

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

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

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

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

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

}Thread.stop

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

end$threads.clear

}

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

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

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

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

MapReduce JS + R Fx

WordCountController

WordCountViewMapReduceController

MapReduce.js

WordCountModel

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

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

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();

}

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

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

});

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

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

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

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

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

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

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

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

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

追伸

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

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

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

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

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

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

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

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

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

参考サイト• 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

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

参考書

読んでないけど。。。

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

MapReduce JS + R

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

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

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

おしまい。

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

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