Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ブラウザで
MapReduce風味の
    偱分散叀
 (MapReduce JS + R)




                                    0 会
                              ...
あじぇんだ
• の生い ちについて(約2時間)
• Googleの基盤技術&MapReduceとは
• ブラウザでMapReduce風味
 – デモ(約2秒)
 – かんたんな説明
• Hadoopについて多くは語らない
プロフィール風味
• shunsuk
  – http://in-action.net/shunsuk/
  – 医者を志す妻を応援する夫の日記
    http://d.hatena.ne.jp/shunsuk/
• 開発経験(抜粋)
  –...
Googleの基盤技術&
MapReduceについて
   さらっと説明
Googleの基盤技術
• Google File System (GFS)
  – 大規模分散ファイルシステム
• MapReduce
  – 大規模分散計算フレームワーク
• BigTable
  – 大規模分散データベース
• Chubb...
MapReduceとは
• Google
  – 厱卽(2004 )
  – Google Research Publication: MapReduce
    http://labs.google.com/papers/mapreduce
...
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...
Word Count
• MapReduceのHello World
• ドキュメント中の単語の出現数をカウント
Map
• 単語を偱
   map(String key, String value):
    // key: document name
    // value: document contents
    for each word w...
Reduce
• 単語数を集計
  reduce(String key, Iterator values):
   // key: a word
   // values: a list of counts
   int result = 0;...
ブラウザで
MapReduce風味
MapReduce JS + R
• MapReduceっぽいことをブラウザで
• 配布がカンタンかなと思ってさ
• パフォーマンスについて、
  とやかく言うのはヤボってもんだよ
• 名前の由来
 – the end of genesis T...
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(quot; quot;);
    for (var i = 0; i < wor...
Mapの後
• Client -> Server

       <“grape”, “1, 1, 1, 1, ...”>,
       <“orange”, “1, 1, 1, 1, ...”>,
       <“banana”, “1,...
Shuffle
• 実際は、Map -> Shuffle -> Reduce
• キーごとに

  Shuffle

     <“grape”, “1, 1, 1, 1, 1, 1, 1, ...”>,
     <“orange”, “1,...
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(k...
Reduceの後
• Client -> Server


          <“grape”, “128”>
Complete

Complete

   grape : 128
   orange : 130
   banana : 116
設計とか
実装とか
Ajax
• 強引な数珠つなぎ
Ajaxリクエスト
     コールバック
        Map叀
        Ajaxリクエスト
             コールバック
                Reduce叀
         ...
Comet
• サーバーからクライアントにイベント通知
• 実装方法
  – コネクションを張りっぱなしにする
• サーバー
  – Tomcatなど
• Lingr
  – 厖傒したけど
Comet風味
• WEBrick
  – 実はマルチスレッド
  – Railsはオプションで
    • ActionController::Base.allow_concurrency = true

• コネクション張りっぱなし
  –...
Threadの停止と再開

$mutex.synchronize {
  $threads << Thread.current
}
Thread.stop

$mutex.synchronize {
  $threads.each do |t|...
フレームワーク化
• フレームワークがドメインロジックに
  依存してはいけない
• ドメインロジックは交換可能に
MapReduce JS + R Fx

WordCountController
                          MapReduce.js
  WordCountView
                      MapR...
MapとReduceは高階関数で
function map(key, value) { ... }

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

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


m...
あのころの僕らに
足りなかったもの
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/mapreduc
  e.html
• MapReduce - naoyaのはてなダイ...
参考書




読んでないけど。。。
MapReduce JS + R
• ソースコード
 – http://github.com/shunsuk/MapReduc
   e-JS-R/
 – 現在、productionでしか動きません
   • ruby script/serve...
おしまい。
ありがとうございました。
Upcoming SlideShare
Loading in …5
×

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

3,115 views

Published on

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

Published in: Technology

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

  1. 1. ブラウザで MapReduce風味の 偱分散叀 (MapReduce JS + R) 0 会 .3 強 shunsuk 09 F 勉 20 KP .5 shunsuk@in-action.net 3回 第
  2. 2. あじぇんだ • の生い ちについて(約2時間) • Googleの基盤技術&MapReduceとは • ブラウザでMapReduce風味 – デモ(約2秒) – かんたんな説明 • Hadoopについて多くは語らない
  3. 3. プロフィール風味 • shunsuk – http://in-action.net/shunsuk/ – 医者を志す妻を応援する夫の日記 http://d.hatena.ne.jp/shunsuk/ • 開発経験(抜粋) – Windows -> C# – Web -> Ruby on Rails – iPhone <- イマココ • 三姉妹のパパ • 個人事業ニート
  4. 4. Googleの基盤技術& MapReduceについて さらっと説明
  5. 5. Googleの基盤技術 • Google File System (GFS) – 大規模分散ファイルシステム • MapReduce – 大規模分散計算フレームワーク • BigTable – 大規模分散データベース • Chubby – 分散ロックサービス
  6. 6. MapReduceとは • Google – 厱卽(2004 ) – Google Research Publication: MapReduce http://labs.google.com/papers/mapreduce .html • フレームワーク – 超巨大データ – 偱分散叀
  7. 7. MapReduceとは • 叀 をMapとReduceに分ける • コード た うがわかりやすいかも
  8. 8. MapとReduce • ( )配偱の を2倍して合計 フツーに書くと。。。 result = 0 [1, 2, 3].each { |x| result += x * 2 }
  9. 9. MapとReduce • ( )配偱の を2倍して合計 MapとReduceに分ける。 result = [1, 2, 3].map { |x| x * 2}.reduce { |x, y| x + y } MapとReduceが 偱分散叀 できる。 ※Rubyのバージョンによっては、reduceがありません。  かわりにinjectを使ってね。
  10. 10. Word Count • MapReduceのHello World • ドキュメント中の単語の出現数をカウント
  11. 11. Map • 単語を偱 map(String key, String value): // key: document name // value: document contents for each word w in value: EmitIntermediate(w, quot;1quot;);
  12. 12. Reduce • 単語数を集計 reduce(String key, Iterator values): // key: a word // values: a list of counts int result = 0; for each v in values: result += ParseInt(v); Emit(AsString(result));
  13. 13. ブラウザで MapReduce風味
  14. 14. MapReduce JS + R • MapReduceっぽいことをブラウザで • 配布がカンタンかなと思ってさ • パフォーマンスについて、 とやかく言うのはヤボってもんだよ • 名前の由来 – the end of genesis T.M.R. evolution turbo type D からのインスピレーション(かもね)
  15. 15. DEMO • 実際に複数台のPCで動かしてみよう! • 今回は5台限定だよ! • iPhoneでも動くよ!
  16. 16. MapReduce JS + R • 実装 – JavaScript – Ruby on Rails • キーワード – Ajax – Comet風味
  17. 17. 及 Nagare
  18. 18. Mapの前 • Server -> Client <“fruits”, “grape orange banana ...”>
  19. 19. Map • 市内某所、JavaScriptで function map(key, value) { var words = value.split(quot; quot;); for (var i = 0; i < words.length; i++) { this.emit(words[i], quot;1quot;); } }
  20. 20. Mapの後 • Client -> Server <“grape”, “1, 1, 1, 1, ...”>, <“orange”, “1, 1, 1, 1, ...”>, <“banana”, “1, 1, 1, 1, ...”> 通信回数を減らしてみた
  21. 21. Shuffle • 実際は、Map -> Shuffle -> Reduce • キーごとに Shuffle <“grape”, “1, 1, 1, 1, 1, 1, 1, ...”>, <“orange”, “1, 1, 1, 1, 1, 1, 1, ...”>, <“banana”, “1, 1, 1, 1, 1, 1, 1, ...”>
  22. 22. Reduceの前 • Server -> Client <“grape”, “1, 1, 1, 1, 1, 1, 1, 1, ...”>
  23. 23. Reduce • 市内某所、JavaScriptにて function reduce(key, value) { var count = Math.ceil(value.length / 2) + ''; this.emit(key, count); }
  24. 24. Reduceの後 • Client -> Server <“grape”, “128”>
  25. 25. Complete Complete grape : 128 orange : 130 banana : 116
  26. 26. 設計とか 実装とか
  27. 27. Ajax • 強引な数珠つなぎ Ajaxリクエスト コールバック Map叀 Ajaxリクエスト コールバック Reduce叀 Ajaxリクエスト コールバック Complete叀
  28. 28. Comet • サーバーからクライアントにイベント通知 • 実装方法 – コネクションを張りっぱなしにする • サーバー – Tomcatなど • Lingr – 厖傒したけど
  29. 29. Comet風味 • WEBrick – 実はマルチスレッド – Railsはオプションで • ActionController::Base.allow_concurrency = true • コネクション張りっぱなし – Thread.stop
  30. 30. Threadの停止と再開 $mutex.synchronize { $threads << Thread.current } Thread.stop $mutex.synchronize { $threads.each do |t| t.run if t.status == 'sleep' end $threads.clear }
  31. 31. フレームワーク化 • フレームワークがドメインロジックに 依存してはいけない • ドメインロジックは交換可能に
  32. 32. MapReduce JS + R Fx WordCountController MapReduce.js WordCountView MapReduceController WordCountModel ※UMLじゃないよ  (WordCountからMapReduceに矢印を引くのはNG)
  33. 33. 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(); }
  34. 34. パラメータからModelの生成 new Ajax.Request( '/map_reduce/prepare', { method: 'post', parameters: ‘model=word_count' }); model = eval(params[:model].classify).new
  35. 35. あのころの僕らに 足りなかったもの
  36. 36. MapReduce「風味」 • 足りてない – クライアント数に応じてスケール • 今回は5台固定 – 分散ファイルシステム • 今回はサーバーからドキュメントを配信 – タスク分配 • 今回は決め打ち – ストリームっぽさ&非同期っぽさ – 耐障害性
  37. 37. 追伸
  38. 38. MapReduceの適用分野 • ウ ブ匴 のインデックス单成 • データマイニング • 動ファイ ンス分析 • バイオインフォマティクス • ログファイル分析 • 教育、財務分析 • 科学技術シミュレーション
  39. 39. Hadoop • GFSとMapReduceのクローン • オープンソース • Java製 – 厜 出 でいろんな言語OK • Map/Reduce Toolkit (MRToolkit) – HadoopのRubyラッパー
  40. 40. Hadoop • Yahoo!の匴 インデックス单成に 用 • 「Amazon Elastic MapReduce」で匏用 • 楽天のfairyは、 MapReduceじゃないらしいよ
  41. 41. 参考サイト • Google Research Publication: MapReduce http://labs.google.com/papers/mapreduc e.html • MapReduce - naoyaのはてなダイアリー http://d.hatena.ne.jp/naoya/20080511/1 210506301 • Radium Software Development http://www.radiumsoftware.com/0608.h tml#060831
  42. 42. 参考書 読んでないけど。。。
  43. 43. MapReduce JS + R • ソースコード – http://github.com/shunsuk/MapReduc e-JS-R/ – 現在、productionでしか動きません • ruby script/server –e production
  44. 44. おしまい。
  45. 45. ありがとうございました。

×