あじぇんだ• の生い ちについて(約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
おしまい。
ありがとうございました。
Top Related