PHP と MySQL で    1-Click  MapReduce(@ニコニコ超会議)  @yuya_takeyama
はじめに
1-Click無理でした!!!
PHP と MySQL で       1-Click1カチャカチャカチャ...ッターン!      MapReduce    (@ニコニコ超会議)     @yuya_takeyama
N番煎じでお送りします•   MyMR on GitHub    https://github.com/yuya-takeyama/mymr•   PHP と MySQL でカジュアルに MapReduce する    http://blog....
MapReduce とは(word count による例)
MapReduce とはデータ処理のためのプログラミングモデル
入力処理の流れ      ↓         Map           ↓        Shuffle           ↓        Reduce           ↓          出力
Map•入力データを受け取り• 複数の Key/Value ペアを出力
•to be or not to be
•<"to", 1>•<"be", 1>•<"or", 1>•<"not", 1>•<"to", 1>•<"be", 1>
Shuffle•Map による Key/Value を• Key ごとにまとめて出力
•<"to", 1>•<"be", 1>•<"or", 1>•<"not", 1>•<"to", 1>•<"be", 1>
•<"be", [1, 1]>•<"not", [1]>•<"or", [1]>•<"to", [1, 1]>
Reduce•Shuffle による中間データを• 集約して答えを出力
•<"be", [1, 1]>•<"not", [1]>•<"or", [1]>•<"to", [1, 1]>
•<"be", 2>•<"not", 1>•<"or", 1>•<"to", 2>
複数の関数の入出力を経て最終的な答えを出力
ところで
MySQL でMapReduce  したい!!!
それ  MySQL で  も1     カチ        ャカMapReduce  チャ              ...っ                   ター                     ン!               ...
モチベーション•プログラミングモデルとしてのMapReduce を使いたい•   GROUP BY では難しい集計•MySQL を入出力にしたい• LL でサクッとやりたい
モチベーション•プログラミングモデルとしてのMapReduce を使いたい•   GROUP BY では難しい集計•MySQL を入出力にしたい            PHP である必要はあまり無い• LL でサクッとやりたい
モチベーション •もち プログラミングモデルとしての  ろん     1カ  MapReduce を使いたい        チャ           カチ              ャ... • GROUP BY では難しい集計ッタ      ...
というわけで作りました
MyMR   https://github.com/yuya-takeyama/mymr•MySQL を入出力とする• PHP で Map/Reduce を書く• カチャカチャ...ッターン!で実行
実行までの流れ•入出力に使う MySQL テーブルの用意•PHP で Map 関数を書く•PHP で Reduce 関数を書く•mymr コマンドを実行する
実行までの流れ•入出力に使う MySQL テーブルの用意•PHP で Map 関数を書く•PHP で Reduce 関数を書く•mymr コマンドを実行する           この辺がカチャカチャカチャ...
実行までの流れ•入出力に使う MySQL テーブルの用意•PHP で Map 関数を書く•PHP で Reduce 関数を書く•mymr コマンドを実行する            この辺が...ッターン!
に よ る yM RM    文章中の単語の数を数える例 (word count)
use MyMRBuilder;                      Map/Reduce の定義$builder = new Builder;$builder->setInputTable(root@localhost/db/texts...
use MyMRBuilder;                      Map/Reduce の定義$builder = new Builder;$builder->setInputTable(root@localhost/db/texts...
use MyMRBuilder;                      Map/Reduce の定義$builder = new Builder;$builder->setInputTable(root@localhost/db/texts...
use MyMRBuilder;                      Map/Reduce の定義$builder = new Builder;$builder->setInputTable(root@localhost/db/texts...
入力•to be or not to be
Mapfunction ($record, $emitter) {    $words = preg_split(/s+/u,                        $record[text]);    foreach ($words ...
Map       レコードを                       連想配列として受け取るfunction ($record, $emitter) {    $words = preg_split(/s+/u,             ...
Mapfunction ($record, $emitter) {    $words = preg_split(/s+/u,                        $record[text]);    foreach ($words ...
Mapfunction ($record, $emitter) {    $words = preg_split(/s+/u,                        $record[text]);    foreach ($words ...
+----+--------------------+Map    | id | text               |       +----+--------------------+       | 1 | to be or not t...
+----+--------------------+Map          | id | text               |             +----+--------------------+             | ...
+----+---------+-------+                            | id | key     | value |Shuffle                      +----+---------+--...
Reducefunction ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array...
Reduce                 Key      Value の配列function ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $...
Reduce                         Value を全て足すfunction ($key, $values) {    $sum = 0;    foreach ($values as $count) {        ...
Reducefunction ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array...
+---------+--------+            | key     | values |Reduce      +---------+--------+            | be      | 1,1    |      ...
+---------+--------+                 | key     | values |Reduce           +---------+--------+                 | be      |...
今後の目標•非同期 INSERT による並列化• Hadoop へのシームレスな移行方法の提供
今後の野望•V8 エンジンとかで•ストレージエンジン API を• カジュアルに叩いて•MapReduce したい
今後の野望もち • ろん エンジンとかで   V8 1        カチ          ャカ •          チャ   ストレージエンジン API を               ...ッ                    ター...
ご清聴 ありがとうございました
Upcoming SlideShare
Loading in...5
×

PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)

1,539

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,539
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
12
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

PHP と MySQL で 1 カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議)

  1. 1. PHP と MySQL で 1-Click MapReduce(@ニコニコ超会議) @yuya_takeyama
  2. 2. はじめに
  3. 3. 1-Click無理でした!!!
  4. 4. PHP と MySQL で 1-Click1カチャカチャカチャ...ッターン! MapReduce (@ニコニコ超会議) @yuya_takeyama
  5. 5. N番煎じでお送りします• MyMR on GitHub https://github.com/yuya-takeyama/mymr• PHP と MySQL でカジュアルに MapReduce する http://blog.yuyat.jp/archives/1706• もっとカジュアルに PHP と MySQL で MapReduce する http://blog.yuyat.jp/archives/1853• PHP と MySQL でカジュアルに MapReduce する (スライド・Long Version) http://www.slideshare.net/taketyan/php-mysql-mapreduce• PHP と MySQL でカジュアルに MapReduce する (スライド・Short Version) http://www.slideshare.net/taketyan/php-mysql- mapreduce-short-version
  6. 6. MapReduce とは(word count による例)
  7. 7. MapReduce とはデータ処理のためのプログラミングモデル
  8. 8. 入力処理の流れ ↓ Map ↓ Shuffle ↓ Reduce ↓ 出力
  9. 9. Map•入力データを受け取り• 複数の Key/Value ペアを出力
  10. 10. •to be or not to be
  11. 11. •<"to", 1>•<"be", 1>•<"or", 1>•<"not", 1>•<"to", 1>•<"be", 1>
  12. 12. Shuffle•Map による Key/Value を• Key ごとにまとめて出力
  13. 13. •<"to", 1>•<"be", 1>•<"or", 1>•<"not", 1>•<"to", 1>•<"be", 1>
  14. 14. •<"be", [1, 1]>•<"not", [1]>•<"or", [1]>•<"to", [1, 1]>
  15. 15. Reduce•Shuffle による中間データを• 集約して答えを出力
  16. 16. •<"be", [1, 1]>•<"not", [1]>•<"or", [1]>•<"to", [1, 1]>
  17. 17. •<"be", 2>•<"not", 1>•<"or", 1>•<"to", 2>
  18. 18. 複数の関数の入出力を経て最終的な答えを出力
  19. 19. ところで
  20. 20. MySQL でMapReduce したい!!!
  21. 21. それ MySQL で も1 カチ ャカMapReduce チャ ...っ ター ン! で したい!!!
  22. 22. モチベーション•プログラミングモデルとしてのMapReduce を使いたい• GROUP BY では難しい集計•MySQL を入出力にしたい• LL でサクッとやりたい
  23. 23. モチベーション•プログラミングモデルとしてのMapReduce を使いたい• GROUP BY では難しい集計•MySQL を入出力にしたい PHP である必要はあまり無い• LL でサクッとやりたい
  24. 24. モチベーション •もち プログラミングモデルとしての ろん 1カ MapReduce を使いたい チャ カチ ャ... • GROUP BY では難しい集計ッタ ーン !で • MySQL を入出力にしたい PHP である必要はあまり無い • LL でサクッとやりたい
  25. 25. というわけで作りました
  26. 26. MyMR https://github.com/yuya-takeyama/mymr•MySQL を入出力とする• PHP で Map/Reduce を書く• カチャカチャ...ッターン!で実行
  27. 27. 実行までの流れ•入出力に使う MySQL テーブルの用意•PHP で Map 関数を書く•PHP で Reduce 関数を書く•mymr コマンドを実行する
  28. 28. 実行までの流れ•入出力に使う MySQL テーブルの用意•PHP で Map 関数を書く•PHP で Reduce 関数を書く•mymr コマンドを実行する この辺がカチャカチャカチャ...
  29. 29. 実行までの流れ•入出力に使う MySQL テーブルの用意•PHP で Map 関数を書く•PHP で Reduce 関数を書く•mymr コマンドを実行する この辺が...ッターン!
  30. 30. に よ る yM RM 文章中の単語の数を数える例 (word count)
  31. 31. use MyMRBuilder; Map/Reduce の定義$builder = new Builder;$builder->setInputTable(root@localhost/db/texts);$builder->setOutputTable(root@localhost/db/word_counts);$builder->setMapper(function ($record, $emitter) {    $words = preg_split(/s+/u, $record[text]);    foreach ($words as $word) {        $emitter->emit($word, 1);    }});$builder->setReducer(function ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array(count => $sum);});return $builder;
  32. 32. use MyMRBuilder; Map/Reduce の定義$builder = new Builder;$builder->setInputTable(root@localhost/db/texts);$builder->setOutputTable(root@localhost/db/word_counts);$builder->setMapper(function ($record, $emitter) {    $words = preg_split(/s+/u, $record[text]);    foreach ($words as $word) { 入出力テーブルの指定        $emitter->emit($word, 1);    }});$builder->setReducer(function ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array(count => $sum);});return $builder;
  33. 33. use MyMRBuilder; Map/Reduce の定義$builder = new Builder;$builder->setInputTable(root@localhost/db/texts);$builder->setOutputTable(root@localhost/db/word_counts);$builder->setMapper(function ($record, $emitter) {    $words = preg_split(/s+/u, $record[text]);    foreach ($words as $word) {        $emitter->emit($word, 1);    } この辺が Map});$builder->setReducer(function ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array(count => $sum);});return $builder;
  34. 34. use MyMRBuilder; Map/Reduce の定義$builder = new Builder;$builder->setInputTable(root@localhost/db/texts);$builder->setOutputTable(root@localhost/db/word_counts);$builder->setMapper(function ($record, $emitter) {    $words = preg_split(/s+/u, $record[text]);    foreach ($words as $word) {        $emitter->emit($word, 1);    }});$builder->setReducer(function ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array(count => $sum); この辺が Reduce});return $builder;
  35. 35. 入力•to be or not to be
  36. 36. Mapfunction ($record, $emitter) {    $words = preg_split(/s+/u, $record[text]);    foreach ($words as $word) {        $emitter->emit($word, 1);    }}
  37. 37. Map レコードを 連想配列として受け取るfunction ($record, $emitter) {    $words = preg_split(/s+/u, $record[text]);    foreach ($words as $word) {        $emitter->emit($word, 1);    }}
  38. 38. Mapfunction ($record, $emitter) {    $words = preg_split(/s+/u, $record[text]);    foreach ($words as $word) {        $emitter->emit($word, 1);    }} text カラム内の 文字列をスペースで分割
  39. 39. Mapfunction ($record, $emitter) {    $words = preg_split(/s+/u, $record[text]);    foreach ($words as $word) {        $emitter->emit($word, 1);    }} Key/Value のペアとして 中間テーブルに INSERT
  40. 40. +----+--------------------+Map | id | text | +----+--------------------+ | 1 | to be or not to be | +----+--------------------+ ↓ レコードを連想配列として Map へ ↓ +----+---------+-------+ | id | key | value | +----+---------+-------+ | 1 | to | 1 | | 2 | be | 1 | | 3 | or | 1 | | 4 | not | 1 | | 5 | to | 1 | | 6 | be | 1 | +----+---------+-------+
  41. 41. +----+--------------------+Map | id | text | +----+--------------------+ | 1 | to be or not to be | +----+--------------------+ ↓ レコードを連想配列として Map へ ↓ +----+---------+-------+ | id | key | value | +----+---------+-------+ | 1 | to | 1 | | 2 | be | 1 | | 3 | or | 1 | | 4 | not value には JSON で入れるので | 1 | | 5 | to 構造化データも使用可能 | 1 | | 6 | be | 1 | +----+---------+-------+
  42. 42. +----+---------+-------+ | id | key | value |Shuffle +----+---------+-------+ | 1 | to | 2 | be | 1 | 1 | | | 3 | or | 1 | | 4 | not | 1 | | 5 | to | 1 | | 6 | be | 1 | +----+---------+-------+ ↓ キーで GROUP BY して ↓SELECT ↓ 値は GROUP_CONCAT ↓ `key`, +---------+--------+ GROUP_CONCAT(`value`) | key | values |FROM +---------+--------+ `中間テーブル` | be | 1,1 | | not | 1 |GROUP BY | or | 1 | `key` | to | 1,1 | +---------+--------+
  43. 43. Reducefunction ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array(count => $sum);}
  44. 44. Reduce Key Value の配列function ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array(count => $sum);}
  45. 45. Reduce Value を全て足すfunction ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array(count => $sum);}
  46. 46. Reducefunction ($key, $values) {    $sum = 0;    foreach ($values as $count) {        $sum += $count;    }    return array(count => $sum);} 返り値の連想配列を レコードとして INSERT
  47. 47. +---------+--------+ | key | values |Reduce +---------+--------+ | be | 1,1 | | not | 1 | | or | 1 | | to | 1,1 | +---------+--------+ ↓ キーと値の配列を Reduce へ ↓ +----+---------+-------+ | id | key | count | +----+---------+-------+ | 1 | be | 2 | | 2 | not | 1 | | 3 | or | 1 | | 4 | to | 2 | +----+---------+-------+
  48. 48. +---------+--------+ | key | values |Reduce +---------+--------+ | be | 1,1 | | not | 1 | | or | 1 | 実際にはデリミタとして改行を使用| to | 1,1 | +---------+--------+ 改行区切りの JSON になる ↓ キーと値の配列を Reduce へ ↓ +----+---------+-------+ | id | key | count | +----+---------+-------+ | 1 | be | 2 | | 2 | not | 1 | | 3 | or | 1 | | 4 | to | 2 | +----+---------+-------+
  49. 49. 今後の目標•非同期 INSERT による並列化• Hadoop へのシームレスな移行方法の提供
  50. 50. 今後の野望•V8 エンジンとかで•ストレージエンジン API を• カジュアルに叩いて•MapReduce したい
  51. 51. 今後の野望もち • ろん エンジンとかで V8 1 カチ ャカ • チャ ストレージエンジン API を ...ッ ター • カジュアルに叩いて ン! で •MapReduce したい
  52. 52. ご清聴 ありがとうございました
  1. ¿Le ha llamado la atención una diapositiva en particular?

    Recortar diapositivas es una manera útil de recopilar información importante para consultarla más tarde.

×