際際滷

際際滷Share a Scribd company logo
PHP と MySQL で
  カジュアルに
MapReduce する

   @yuya_takeyama
アジェンダ

?MapReduce とは

? 徭恬フレ`ムワ`ク
MyMR の府初
お僅り (1)

ビッグデ`タのは
  ありません
お僅り (2)

  I佞任
まだやってません
お僅り (3)

 Hadoop
 隆UYです
   ☆MongoDB での
MapReduce ならやりました
MapReduce とは
耕嗤兆~として

?
Google の寄トデ`タI尖フ
レ`ムワ`ク

?
碧インデックスの恬撹とかに
聞われている
噸宥兆~として
?Map/Reduce v方でデ`タを
 I尖するプログラミングモデル

?   マシンをやしただけスケ`ル

?Hadoop, MongoDB,
 CouchDB などが麼なg廾
秘薦
I尖の送れ      ◎
         Map
           ◎
        Reduce
           ◎
          竃薦
やや畜な          秘薦
 I尖の送れ          ◎
              Map
                ◎
             Shuf?e
                ◎
             Reduce
より畜には          ◎
もっと}jらしいです
               竃薦
Map


?秘薦デ`タを鞭け函り
? }方の Key/Value ペアを竃薦
Shuf?e


?Map による Key/Value を
? Key ごとにまとめて竃薦
Reduce


?Shuf?e による嶄gデ`タを
? 鹿sして基えを竃薦
}方のv方の
秘竃薦をUて
恷K議な基えを竃薦
猟嫗嶄の
gZの方を方える箭
 (word count)
秘薦


?to be or not to be
Map   ?<"to", 1>
      ?<"be", 1>
      ?<"or", 1>
      ?<"not", 1>
      ?<"to", 1>
      ?<"be", 1>
Shuf?e
   ?<"be", [1, 1]>
   ?<"not", [1]>
   ?<"or", [1]>
   ?<"to", [1, 1]>
Reduce
  ? <"be", 2>
  ? <"not", 1>
  ? <"or", 1>
  ? <"to", 2>
MapReduce の旋泣
?Map も Reduce もK双晒
すればスケ`ルする

?v方侏っぽい深え圭が試きる
☆ただし, Hadoop や MongoDB の MapReduce の Map と Reduce は
?v方侏冱Zのそれとはややなる (歌孚邑^でなかったり)



?   パタ`ンとして慌嗤しやすい
☆返Aき侏のバッチI尖と曳^して
MongoDB について

?
宥械は MapReduce を
K双にg佩することができない

?   それでも MapReduce は宴旋

?採絞か?
スケ`ラビリティだけじゃない

?プログラミングモデルとしての
 MapReduce にも、ある

?   MongoDB でI尖が頼Y

?JS でv方ふたつくだけ
MySQL でも
MapReduce
  したい!!!
というわけで恬りました
MyMR
   https://github.com/yuya-takeyama/mymr


?MySQL を秘竃薦とする

? PHP で Map/Reduce をく

? コマンドラインでg佩
MyMR によるI尖の送れ
?テ`ブルからレコ`ドをiむ
?1 佩 1 佩に Map (PHP) をm喘して
  嶄gテ`ブルへ

?MySQL による Shuf?e
?そのY惚に Reduce (PHP) をm喘して
  竃薦テ`ブルへ
に よ る
 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
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
+----+--------------------+

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    |
                              +---------+--------+
+---------+--------+
            | 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 |
                +----+---------+-------+
モチベ`ション

?
プログラミングモデルとしての
MapReduce を聞いたい

?   MySQL を秘竃薦にしたい

?LL でサクッとやりたい
モチベ`ション

?
プログラミングモデルとしての
MapReduce を聞いたい

?   MySQL を秘竃薦にしたい

?LL でサクッとやりたい
       PHP である駅勣はあまりoい
書瘁の朕


?掲揖豚 INSERT によるK双晒
? Hadoop へのシ`ムレスな
卞佩圭隈の戻工
まとめ

?
ビッグデ`タはoくとも
MapReduce は嗤

?   MySQL でできたら宴旋なはず

?PHP でけたらSしいはず
リンク

? 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
ご賠
 ありがとう
ございました

More Related Content

PHP と MySQL でカジュアルに MapReduce する

  • 1. PHP と MySQL で カジュアルに MapReduce する @yuya_takeyama
  • 4. お僅り (2) I佞任 まだやってません
  • 5. お僅り (3) Hadoop 隆UYです ☆MongoDB での MapReduce ならやりました
  • 8. 噸宥兆~として ?Map/Reduce v方でデ`タを I尖するプログラミングモデル ? マシンをやしただけスケ`ル ?Hadoop, MongoDB, CouchDB などが麼なg廾
  • 9. 秘薦 I尖の送れ ◎ Map ◎ Reduce ◎ 竃薦
  • 10. やや畜な 秘薦 I尖の送れ ◎ Map ◎ Shuf?e ◎ Reduce より畜には ◎ もっと}jらしいです 竃薦
  • 12. Shuf?e ?Map による Key/Value を ? Key ごとにまとめて竃薦
  • 16. 秘薦 ?to be or not to be
  • 17. Map ?<"to", 1> ?<"be", 1> ?<"or", 1> ?<"not", 1> ?<"to", 1> ?<"be", 1>
  • 18. Shuf?e ?<"be", [1, 1]> ?<"not", [1]> ?<"or", [1]> ?<"to", [1, 1]>
  • 19. Reduce ? <"be", 2> ? <"not", 1> ? <"or", 1> ? <"to", 2>
  • 20. MapReduce の旋泣 ?Map も Reduce もK双晒 すればスケ`ルする ?v方侏っぽい深え圭が試きる ☆ただし, Hadoop や MongoDB の MapReduce の Map と Reduce は ?v方侏冱Zのそれとはややなる (歌孚邑^でなかったり) ? パタ`ンとして慌嗤しやすい ☆返Aき侏のバッチI尖と曳^して
  • 21. MongoDB について ? 宥械は MapReduce を K双にg佩することができない ? それでも MapReduce は宴旋 ?採絞か?
  • 23. MySQL でも MapReduce したい!!!
  • 25. MyMR https://github.com/yuya-takeyama/mymr ?MySQL を秘竃薦とする ? PHP で Map/Reduce をく ? コマンドラインでg佩
  • 26. MyMR によるI尖の送れ ?テ`ブルからレコ`ドをiむ ?1 佩 1 佩に Map (PHP) をm喘して 嶄gテ`ブルへ ?MySQL による Shuf?e ?そのY惚に Reduce (PHP) をm喘して 竃薦テ`ブルへ
  • 27. に よ る yM R M 猟嫗嶄の gZの方を方える箭 (word count)
  • 28. 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;
  • 29. 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;
  • 30. 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;
  • 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); このxが Reduce }); return $builder;
  • 32. 秘薦 ?to be or not to be
  • 33. Map function ($record, $emitter) { ????$words = preg_split('/s+/u', $record['text']); ????foreach ($words as $word) { ????????$emitter->emit($word, 1); ????} }
  • 34. Map レコ`ドを B訶篩个箸靴栃椶曳, function ($record, $emitter) { ????$words = preg_split('/s+/u', $record['text']); ????foreach ($words as $word) { ????????$emitter->emit($word, 1); ????} }
  • 35. Map function ($record, $emitter) { ????$words = preg_split('/s+/u', $record['text']); ????foreach ($words as $word) { ????????$emitter->emit($word, 1); ????} } text カラム坪の 猟忖双をスペ`スで蛍護
  • 36. Map function ($record, $emitter) { ????$words = preg_split('/s+/u', $record['text']); ????foreach ($words as $word) { ????????$emitter->emit($word, 1); ????} } Key/Value のペアとして 嶄gテ`ブルに INSERT
  • 37. Reduce function ($key, $values) { ????$sum = 0; ????foreach ($values as $count) { ????????$sum += $count; ????} ????return array('count' => $sum); }
  • 38. Reduce Key Value の塘双 function ($key, $values) { ????$sum = 0; ????foreach ($values as $count) { ????????$sum += $count; ????} ????return array('count' => $sum); }
  • 39. Reduce Value を畠て怎す function ($key, $values) { ????$sum = 0; ????foreach ($values as $count) { ????????$sum += $count; ????} ????return array('count' => $sum); }
  • 40. Reduce function ($key, $values) { ????$sum = 0; ????foreach ($values as $count) { ????????$sum += $count; ????} ????return array('count' => $sum); } 卦り、累B訶篩个 レコ`ドとして INSERT
  • 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 | 1 | | 5 | to | 1 | | 6 | be | 1 | +----+---------+-------+
  • 42. +----+--------------------+ 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 | +----+---------+-------+
  • 43. +----+---------+-------+ | 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 | +---------+--------+
  • 44. +---------+--------+ | 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 | +----+---------+-------+
  • 45. +---------+--------+ | 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 | +----+---------+-------+
  • 46. モチベ`ション ? プログラミングモデルとしての MapReduce を聞いたい ? MySQL を秘竃薦にしたい ?LL でサクッとやりたい
  • 47. モチベ`ション ? プログラミングモデルとしての MapReduce を聞いたい ? MySQL を秘竃薦にしたい ?LL でサクッとやりたい PHP である駅勣はあまりoい
  • 48. 書瘁の朕 ?掲揖豚 INSERT によるK双晒 ? Hadoop へのシ`ムレスな 卞佩圭隈の戻工
  • 49. まとめ ? ビッグデ`タはoくとも MapReduce は嗤 ? MySQL でできたら宴旋なはず ?PHP でけたらSしいはず
  • 50. リンク ? 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