際際滷

際際滷Share a Scribd company logo
PHP と MySQL で
    1-Click
  MapReduce
(@ニコニコ階氏h)

  @yuya_takeyama
はじめに
1-Click
o尖でした。。
PHP と MySQL で
       1-Click
1カチャカチャカチャ...ッタ`ン
      MapReduce
    (@ニコニコ階氏h)

     @yuya_takeyama
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
MapReduce とは
(word count による箭)
MapReduce とは

デ`タI尖のための
プログラミングモデル
秘薦
I尖の送れ      ◎
         Map
           ◎
        Shuf?e
           ◎
        Reduce
           ◎
          竃薦
Map


?秘薦デ`タを鞭け函り
? }方の Key/Value ペアを竃薦
?to be or not to be
?<"to", 1>
?<"be", 1>
?<"or", 1>
?<"not", 1>
?<"to", 1>
?<"be", 1>
Shuf?e


?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


?Shuf?e による嶄gデ`タを
? 鹿sして基えを竃薦
?<"be", [1, 1]>
?<"not", [1]>
?<"or", [1]>
?<"to", [1, 1]>
?<"be", 2>
?<"not", 1>
?<"or", 1>
?<"to", 2>
}方のv方の
秘竃薦をUて
恷K議な基えを竃薦
ところで
MySQL で
MapReduce
  したい!!!
それ
  MySQL で
  も1
     カチ
        ャカ
MapReduce  チャ
              ...っ
                   タ`
                     ン
                        で

    したい!!!
モチベ`ション
?
プログラミングモデルとしての
MapReduce を聞いたい

?   GROUP BY ではyしい鹿

?MySQL を秘竃薦にしたい
? LL でサクッとやりたい
モチベ`ション
?
プログラミングモデルとしての
MapReduce を聞いたい

?   GROUP BY ではyしい鹿

?MySQL を秘竃薦にしたい
            PHP である駅勣はあまりoい


? LL でサクッとやりたい
モチベ`ション
 ?
もち プログラミングモデルとしての
  ろん
     1カ
  MapReduce を聞いたい
        チャ
           カチ
              ャ...
 ? GROUP BY ではyしい鹿ッタ
                      `ン
                          ,
 ? MySQL を秘竃薦にしたい
              PHP である駅勣はあまりoい


 ? LL でサクッとやりたい
というわけで恬りました
MyMR
   https://github.com/yuya-takeyama/mymr


?MySQL を秘竃薦とする

? PHP で Map/Reduce をく

? カチャカチャ...ッタ`ン,g佩
g佩までの送れ

?秘竃薦に聞う MySQL テ`ブルの喘吭
?PHP で Map v方をく
?PHP で Reduce v方をく
?mymr コマンドをg佩する
g佩までの送れ

?秘竃薦に聞う MySQL テ`ブルの喘吭
?PHP で Map v方をく
?PHP で Reduce v方をく
?mymr コマンドをg佩する
           このxがカチャカチャカチャ...
g佩までの送れ

?秘竃薦に聞う MySQL テ`ブルの喘吭
?PHP で Map v方をく
?PHP で Reduce v方をく
?mymr コマンドをg佩する
            このxが...ッタ`ン
に よ る
 yM R
M
    猟嫗嶄の
gZの方を方える箭
 (word count)
use MyMRBuilder;
                      Map/Reduce の協x
$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;
use MyMRBuilder;
                      Map/Reduce の協x
$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;
use MyMRBuilder;
                      Map/Reduce の協x
$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);
????}                                    このxが Map
});

$builder->setReducer(function ($key, $values) {
????$sum = 0;
????foreach ($values as $count) {
????????$sum += $count;
????}
????return array('count' => $sum);
});

return $builder;
use MyMRBuilder;
                      Map/Reduce の協x
$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);      このxが Reduce
});

return $builder;
秘薦


?to be or not to be
Map

function ($record, $emitter) {
????$words = preg_split('/s+/u',
                        $record['text']);
????foreach ($words as $word) {
????????$emitter->emit($word, 1);
????}
}
Map       レコ`ドを
                       B訶篩个箸靴栃椶曳,

function ($record, $emitter) {
????$words = preg_split('/s+/u',
                        $record['text']);
????foreach ($words as $word) {
????????$emitter->emit($word, 1);
????}
}
Map

function ($record, $emitter) {
????$words = preg_split('/s+/u',
                        $record['text']);
????foreach ($words as $word) {
????????$emitter->emit($word, 1);
????}
}                         text カラム坪の
                       猟忖双をスペ`スで蛍護
Map

function ($record, $emitter) {
????$words = preg_split('/s+/u',
                        $record['text']);
????foreach ($words as $word) {
????????$emitter->emit($word, 1);
????}
}
                    Key/Value のペアとして
                    嶄gテ`ブルに INSERT
+----+--------------------+

Map    | id | text               |
       +----+--------------------+
       | 1 | to be or not to be |
       +----+--------------------+
      ◎ レコ`ドをB訶篩个箸靴 Map へ ◎
        +----+---------+-------+
        | id | key     | value |
        +----+---------+-------+
        | 1 | to       | 1     |
        | 2 | be       | 1     |
        | 3 | or       | 1     |
        | 4 | not      | 1     |
        | 5 | to       | 1     |
        | 6 | be       | 1     |
        +----+---------+-------+
+----+--------------------+

Map          | id | text               |
             +----+--------------------+
             | 1 | to be or not to be |
             +----+--------------------+
          ◎ レコ`ドをB訶篩个箸靴 Map へ ◎
               +----+---------+-------+
               | id | key     | value |
               +----+---------+-------+
               | 1 | to       | 1     |
               | 2 | be       | 1     |
               | 3 | or       | 1     |
               | 4 | not
 value には JSON で秘れるので         | 1     |
               | 5 | to
     夛晒デ`タも聞喘辛嬬              | 1     |
               | 6 | be       | 1     |
               +----+---------+-------+
+----+---------+-------+
                            | id | key     | value |

Shuf?e                      +----+---------+-------+
                            | 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                          +---------+--------+
  `嶄gテ`ブル`                    | be      | 1,1    |
                              | not     | 1      |
GROUP BY                      | or      | 1      |
  `key`                       | to      | 1,1    |
                              +---------+--------+
Reduce
function ($key, $values) {
????$sum = 0;
????foreach ($values as $count) {
????????$sum += $count;
????}
????return array('count' => $sum);
}
Reduce
                 Key      Value の塘双

function ($key, $values) {
????$sum = 0;
????foreach ($values as $count) {
????????$sum += $count;
????}
????return array('count' => $sum);
}
Reduce
                         Value を畠て怎す
function ($key, $values) {
????$sum = 0;
????foreach ($values as $count) {
????????$sum += $count;
????}
????return array('count' => $sum);
}
Reduce
function ($key, $values) {
????$sum = 0;
????foreach ($values as $count) {
????????$sum += $count;
????}
????return array('count' => $sum);
}
                     卦り、累B訶篩个
                    レコ`ドとして INSERT
+---------+--------+
            | 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 |
           +----+---------+-------+
+---------+--------+
                 | key     | values |
Reduce           +---------+--------+
                 | be      | 1,1    |
                 | not     | 1      |
                 | or      | 1      |
 gHにはデリミタとして個佩を聞喘| to      | 1,1    |
                 +---------+--------+
   個佩曝俳りの JSON になる

             ◎ キ`と、療篩个 Reduce へ ◎
                +----+---------+-------+
                | id | key     | count |
                +----+---------+-------+
                | 1 | be       |     2 |
                | 2 | not      |     1 |
                | 3 | or       |     1 |
                | 4 | to       |     2 |
                +----+---------+-------+
書瘁の朕


?掲揖豚 INSERT によるK双晒
? Hadoop へのシ`ムレスな
卞佩圭隈の戻工
書瘁の勸李

?V8 エンジンとかで

?ストレ`ジエンジン API を
? カジュアルに澣いて

?MapReduce したい
書瘁の勸李
もち
 ? ろん エンジンとかで
   V8 1
        カチ
          ャカ
 ?          チャ
   ストレ`ジエンジン API を
               ...ッ
                    タ`
 ? カジュアルに澣いて          ン
                         で
 ?MapReduce したい
ご賠
 ありがとう
ございました

More Related Content

PHP と MySQL で 1 カチャカチャカチャ...ッタ`ン MapReduce (@ニコニコ階氏h)

  • 1. PHP と MySQL で 1-Click MapReduce (@ニコニコ階氏h) @yuya_takeyama
  • 4. PHP と MySQL で 1-Click 1カチャカチャカチャ...ッタ`ン MapReduce (@ニコニコ階氏h) @yuya_takeyama
  • 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
  • 8. 秘薦 I尖の送れ ◎ Map ◎ Shuf?e ◎ Reduce ◎ 竃薦
  • 10. ?to be or not to be
  • 11. ?<"to", 1> ?<"be", 1> ?<"or", 1> ?<"not", 1> ?<"to", 1> ?<"be", 1>
  • 12. Shuf?e ?Map による Key/Value を ? Key ごとにまとめて竃薦
  • 13. ?<"to", 1> ?<"be", 1> ?<"or", 1> ?<"not", 1> ?<"to", 1> ?<"be", 1>
  • 14. ?<"be", [1, 1]> ?<"not", [1]> ?<"or", [1]> ?<"to", [1, 1]>
  • 16. ?<"be", [1, 1]> ?<"not", [1]> ?<"or", [1]> ?<"to", [1, 1]>
  • 20. MySQL で MapReduce したい!!!
  • 21. それ MySQL で も1 カチ ャカ MapReduce チャ ...っ タ` ン で したい!!!
  • 22. モチベ`ション ? プログラミングモデルとしての MapReduce を聞いたい ? GROUP BY ではyしい鹿 ?MySQL を秘竃薦にしたい ? LL でサクッとやりたい
  • 23. モチベ`ション ? プログラミングモデルとしての MapReduce を聞いたい ? GROUP BY ではyしい鹿 ?MySQL を秘竃薦にしたい PHP である駅勣はあまりoい ? LL でサクッとやりたい
  • 24. モチベ`ション ? もち プログラミングモデルとしての ろん 1カ MapReduce を聞いたい チャ カチ ャ... ? GROUP BY ではyしい鹿ッタ `ン , ? MySQL を秘竃薦にしたい PHP である駅勣はあまりoい ? LL でサクッとやりたい
  • 26. MyMR https://github.com/yuya-takeyama/mymr ?MySQL を秘竃薦とする ? PHP で Map/Reduce をく ? カチャカチャ...ッタ`ン,g佩
  • 27. g佩までの送れ ?秘竃薦に聞う MySQL テ`ブルの喘吭 ?PHP で Map v方をく ?PHP で Reduce v方をく ?mymr コマンドをg佩する
  • 28. g佩までの送れ ?秘竃薦に聞う MySQL テ`ブルの喘吭 ?PHP で Map v方をく ?PHP で Reduce v方をく ?mymr コマンドをg佩する このxがカチャカチャカチャ...
  • 29. g佩までの送れ ?秘竃薦に聞う MySQL テ`ブルの喘吭 ?PHP で Map v方をく ?PHP で Reduce v方をく ?mymr コマンドをg佩する このxが...ッタ`ン
  • 30. に よ る yM R M 猟嫗嶄の gZの方を方える箭 (word count)
  • 31. use MyMRBuilder; Map/Reduce の協x $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. use MyMRBuilder; Map/Reduce の協x $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. use MyMRBuilder; Map/Reduce の協x $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); ????} このxが Map }); $builder->setReducer(function ($key, $values) { ????$sum = 0; ????foreach ($values as $count) { ????????$sum += $count; ????} ????return array('count' => $sum); }); return $builder;
  • 34. use MyMRBuilder; Map/Reduce の協x $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); このxが Reduce }); return $builder;
  • 35. 秘薦 ?to be or not to be
  • 36. Map function ($record, $emitter) { ????$words = preg_split('/s+/u', $record['text']); ????foreach ($words as $word) { ????????$emitter->emit($word, 1); ????} }
  • 37. Map レコ`ドを B訶篩个箸靴栃椶曳, function ($record, $emitter) { ????$words = preg_split('/s+/u', $record['text']); ????foreach ($words as $word) { ????????$emitter->emit($word, 1); ????} }
  • 38. Map function ($record, $emitter) { ????$words = preg_split('/s+/u', $record['text']); ????foreach ($words as $word) { ????????$emitter->emit($word, 1); ????} } text カラム坪の 猟忖双をスペ`スで蛍護
  • 39. Map function ($record, $emitter) { ????$words = preg_split('/s+/u', $record['text']); ????foreach ($words as $word) { ????????$emitter->emit($word, 1); ????} } Key/Value のペアとして 嶄gテ`ブルに INSERT
  • 40. +----+--------------------+ Map | id | text | +----+--------------------+ | 1 | to be or not to be | +----+--------------------+ ◎ レコ`ドをB訶篩个箸靴 Map へ ◎ +----+---------+-------+ | id | key | value | +----+---------+-------+ | 1 | to | 1 | | 2 | be | 1 | | 3 | or | 1 | | 4 | not | 1 | | 5 | to | 1 | | 6 | be | 1 | +----+---------+-------+
  • 41. +----+--------------------+ Map | id | text | +----+--------------------+ | 1 | to be or not to be | +----+--------------------+ ◎ レコ`ドをB訶篩个箸靴 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. +----+---------+-------+ | id | key | value | Shuf?e +----+---------+-------+ | 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 +---------+--------+ `嶄gテ`ブル` | be | 1,1 | | not | 1 | GROUP BY | or | 1 | `key` | to | 1,1 | +---------+--------+
  • 43. Reduce function ($key, $values) { ????$sum = 0; ????foreach ($values as $count) { ????????$sum += $count; ????} ????return array('count' => $sum); }
  • 44. Reduce Key Value の塘双 function ($key, $values) { ????$sum = 0; ????foreach ($values as $count) { ????????$sum += $count; ????} ????return array('count' => $sum); }
  • 45. Reduce Value を畠て怎す function ($key, $values) { ????$sum = 0; ????foreach ($values as $count) { ????????$sum += $count; ????} ????return array('count' => $sum); }
  • 46. Reduce function ($key, $values) { ????$sum = 0; ????foreach ($values as $count) { ????????$sum += $count; ????} ????return array('count' => $sum); } 卦り、累B訶篩个 レコ`ドとして INSERT
  • 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. +---------+--------+ | key | values | Reduce +---------+--------+ | be | 1,1 | | not | 1 | | or | 1 | gHにはデリミタとして個佩を聞喘| to | 1,1 | +---------+--------+ 個佩曝俳りの JSON になる ◎ キ`と、療篩个 Reduce へ ◎ +----+---------+-------+ | id | key | count | +----+---------+-------+ | 1 | be | 2 | | 2 | not | 1 | | 3 | or | 1 | | 4 | to | 2 | +----+---------+-------+
  • 49. 書瘁の朕 ?掲揖豚 INSERT によるK双晒 ? Hadoop へのシ`ムレスな 卞佩圭隈の戻工
  • 50. 書瘁の勸李 ?V8 エンジンとかで ?ストレ`ジエンジン API を ? カジュアルに澣いて ?MapReduce したい
  • 51. 書瘁の勸李 もち ? ろん エンジンとかで V8 1 カチ ャカ ? チャ ストレ`ジエンジン API を ...ッ タ` ? カジュアルに澣いて ン で ?MapReduce したい