SlideShare ist ein Scribd-Unternehmen logo
1 von 54
Downloaden Sie, um offline zu lesen
Распределенная обработка
          потоковых данных

           Вячеслав Матюхин


           May Perl, Москва, 16-17 мая 2009 года


18 мая 2009 г.
18 мая 2009 г.
Потоки данных




18 мая 2009 г.
Потоки данных
           Какими они бывают?
           • Лог в локальной FS




18 мая 2009 г.
Потоки данных
           Какими они бывают?
           • Лог в локальной FS

           • Таблица в БД




18 мая 2009 г.
Потоки данных
           Какими они бывают?
           • Лог в локальной FS

           • Таблица в БД

           • HTTP-поток




18 мая 2009 г.
Потоки данных
           Как обрабатывать?
                 cron        VS             Демоны

      - асинхронность                 - синхронность

      - простота написания            - init-скрипт, pid-файл, watchdog

      - надежность                    - утечки памяти

      - интеграция с unix-утилитами




18 мая 2009 г.
Потоки данных
           Логи
           • Веб-сервера




18 мая 2009 г.
Потоки данных
           Логи
           • Веб-сервера

           • Базы данных




18 мая 2009 г.
Потоки данных
           Логи
           • Веб-сервера

           • Базы данных

           • Скрипты




18 мая 2009 г.
Потоки данных
           Логи
           • Веб-сервера

           • Базы данных

           • Скрипты

           • Модули (log4perl)




18 мая 2009 г.
Логи
          Особенности
           • Надежность




18 мая 2009 г.
Логи
          Особенности
           • Надежность

           • Простота чтения




18 мая 2009 г.
Логи
          Особенности
           • Надежность

           • Простота чтения

           • Ротация!




18 мая 2009 г.
Пример
          Scheduler
       Будем выкачивать rss.
       Шедулер будет вести лог /var/spool/scheduler.log:

         1000 http://dolboeb.livejournal.com/data/rss
         1017 http://avva.livejournal.com/data/rss
         1018 http://drugoi.livejournal.com/data/rss
         ...




18 мая 2009 г.
Пример
          Scheduler


                 scheduler.pl   /var/spool/scheduler.log




18 мая 2009 г.
Yandex::Unrotate




18 мая 2009 г.
Yandex::Unrotate
       Synopsis
          use Yandex::Unrotate;

          my $reader = Yandex::Unrotate->new({
            LogFile => “/var/spool/scheduler.log”,
            PosFile => “/var/lib/robot.pos”,
          });
          while ($reader->readline) {
            ...
          }
          $reader->commit;




18 мая 2009 г.
Yandex::Unrotate
       Synopsis
          use Yandex::Unrotate;

          my $reader = Yandex::Unrotate->new({
            LogFile => “/var/spool/scheduler.log”,
            PosFile => “/var/lib/robot.pos”,
          });
          while ($reader->readline) {
            ...
          }
          $reader->commit;




18 мая 2009 г.
Yandex::Unrotate
       Synopsis
          use Yandex::Unrotate;

          my $reader = Yandex::Unrotate->new({
            LogFile => “/var/spool/scheduler.log”,
            PosFile => “/var/lib/robot.pos”,
          });
          while ($reader->readline) {
            ...
          }
          $reader->commit;




18 мая 2009 г.
Yandex::Unrotate
       Synopsis
          use Yandex::Unrotate;

          my $reader = Yandex::Unrotate->new({
            LogFile => “/var/spool/scheduler.log”,
            PosFile => “/var/lib/robot.pos”,
          });
          while ($reader->readline) {
            ...
          }
          $reader->commit;




18 мая 2009 г.
Yandex::Unrotate
       Synopsis
          use Yandex::Unrotate;

          my $reader = Yandex::Unrotate->new({
            LogFile => “/var/spool/scheduler.log”,
            PosFile => “/var/lib/robot.pos”,
          });
          while ($reader->readline) {
            ...
          }
          $reader->commit;




18 мая 2009 г.
Пример
          Робот
                 robot.ya.ru
                                    scheduler.pl

                               /var/spool/scheduler.log

                                       robot.pl




18 мая 2009 г.
Yandex::Unrotate
       Возможности
       • CheckInode




18 мая 2009 г.
Yandex::Unrotate
       Возможности
       • CheckInode
       • CheckLastline




18 мая 2009 г.
Yandex::Unrotate
       Возможности
       • CheckInode
       • CheckLastline
       • ->commit(); ->commit($position);




18 мая 2009 г.
Yandex::Unrotate
       Возможности
       • CheckInode
       • CheckLastline
       • ->commit(); ->commit($position);
       • ->lag();




18 мая 2009 г.
Yandex::Unrotate
       Возможности
       • CheckInode
       • CheckLastline
       • ->commit(); ->commit($position);
       • ->lag();


            Ближайший аналог: File::LogReader




18 мая 2009 г.
Yandex::Unrotate
       Файл состояния
          file: /var/spool/scheduler.log
          position: 120000
          inode: 4815162342
          lastline: 21903 http://tema.livejournal.com/data/rss




18 мая 2009 г.
Yandex::Unrotate
       Файл состояния
          file: /var/spool/scheduler.log
          position: 120000
          inode: 4815162342
          lastline: 21903 http://tema.livejournal.com/data/rss



        $ unrotate -n 10 robot.pos
        $ unrotate -n 10 --commit robot.pos




18 мая 2009 г.
Yandex::Unrotate
       А распараллелить?
          $reader = Yandex::Unrotate::Chunk->new(
            LogFile => “/var/spool/scheduler.log”,
            PosFile => “/var/lib/robot.pos”,
            ChunkDir => “/var/lib/robot/chunks/”,
            ChunkCount => 5,
            ChunkSize => 5000,
          ); # откусить новый chunk или взять свободный существующий
          while ($reader->readline) {
            ...
          }
          $reader->commit; # стереть chunk




18 мая 2009 г.
Пример
          Робот с chunk’ами
                 robot.ya.ru



                   scheduler.pl   /var/spool/scheduler.log


                    robot.pl      /var/spool/robot/chunks/chunk1

                    robot.pl      /var/spool/robot/chunks/chunk2

                    robot.pl      /var/spool/robot/chunks/chunk3




18 мая 2009 г.
Yandex::Unrotate
       Мониторинг

       • Да здравствует Log::Log4perl!




18 мая 2009 г.
Yandex::Unrotate
       Мониторинг

       • Да здравствует Log::Log4perl!

       • /var/log/unrotate/failures.log




18 мая 2009 г.
Yandex::Unrotate
       Мониторинг

       • Да здравствует Log::Log4perl!

       • /var/log/unrotate/failures.log

       • ...и /var/log/unrotate/failures.pos




18 мая 2009 г.
А если машин много?




18 мая 2009 г.
Расссылка данных
       propagate
         system(qq{cat $tmpfile | ssh robot1 ‘accept scheduler.log’});
         # или:
         system(q{tar c index | ssh search-host ‘accept index.tar});




18 мая 2009 г.
Рассылка данных
       accept
          my $fname = shift @ARGV or die quot;missing fnamequot;;

          @modules = (
              (grep { ! m#.[^/]*$# } glob quot;/etc/accept.d/*quot;),
          );
          for (@modules) {
              my $object = do ($_);
              warn $@ if $@;
              push @objects, $object if $object;
          }
          for my $object (@objects) {
              exit(0) if $object->process($fname);
          }

          die quot;no module to process $fnamequot;;




18 мая 2009 г.
Расссылка данных
       propagate.d
          $ cat /etc/propagate.d/scheduler
          {
            LogFile => “/var/spool/scheduler.log”,
            PosFile => “/var/lib/propagate.pos”,
            Acceptors => [
               {
                  Host => “robot1”,
                  Key => “/var/lib/ppb_key.rsa”,
                  User => “ppb”,
               },
               {
                  Host => “robot2”,
                  Key => “/var/lib/ppb_key.rsa”,
                  User => “ppb”,
               },
            ],
            Limit => 5000,
          }




18 мая 2009 г.
Расссылка данных
       propagate.d
          Или так:
          $ cat /etc/propagate.d/scheduler
          {
            LogFile => “/var/spool/scheduler.log”,
            PosFile => “/var/lib/propagate.pos”,
            Acceptors => connectdb(“meta”)->selectall_arrayref(q{
                SELECT
                  host AS Host,
                  “ppb” AS User,
                  “/var/lib/ppb-key.rsa” AS Key
                FROM RobotHosts
            }, { Slice => {} }),
            Limit => 5000,
          }




18 мая 2009 г.
Пример
       Много роботов
                                   scheduler.ya.ru

                                          scheduler.pl


                                   /var/spool/scheduler.log




           robot1.ya.ru              robot2.ya.ru              robot3.ya.ru
        /var/spool/scheduler.log   /var/spool/scheduler.log   /var/spool/scheduler.log


                   robot.pl                  robot.pl                  robot.pl



18 мая 2009 г.
PPB::Join




18 мая 2009 г.
PPB::Join
       Для работы с
       отсортированными потоками

       • из файла
       • из базы
       • из памяти




18 мая 2009 г.
PPB::Join
       file_seq

          $seq = file_seq(xopen(“/var/log/robot/links.log”);
          print $seq->shift; # 1000 http://ya.ru
          print $seq->shift; # 1017 http://www.ru
          print $seq->shift; # 1017 http://google.com
          print $seq->shift; # 1018 http://mail.ru




18 мая 2009 г.
PPB::Join
       map_seq

          $seq = map_seq(sub {shift =~ /^(d+)t(S+)$/}, $file_seq);
          $seq->shift; # (1000, “http://ya.ru”)
          $seq->shift; # (1017, “http://www.ru”)
          $seq->shift; # (1017, “http://google.com”)
          $seq->shift; # (1018, “http://mail.ru”)




18 мая 2009 г.
PPB::Join
       split_seq

          $seq = split_seq($file_seq,   “link”, qr/t/);
          $seq->shift; # (1000, {link   => “http://ya.ru”})
          $seq->shift; # (1017, {link   => “http://www.ru”})
          $seq->shift; # (1017, {link   => “http://google.com”})
          $seq->shift; # (1018, {link   => “http://mail.ru”})




18 мая 2009 г.
PPB::Join
       group_seq

          $seq = group_seq($dbh_seq);
          $seq->shift; # (1000, {link => [“http://ya.ru”]})
          $seq->shift; # (1017, {link => [“http://www.ru”,
                       #                  “http://google.com”]})
          $seq->shift; # (1018, {link => “http://mail.ru”})




18 мая 2009 г.
PPB::Join
       dbh_seq

     $seq = dbh_seq(
        $db->prepare(“select id,   url from feeds”),
        “id”
     );
     $seq->shift; # (1000, {url    => “http://dolboeb.livejournal.com”})
     $seq->shift; # (1017, {url    => “http://avva.livejournal.com”})
     $seq->shift; # (1018, {url    => “http://drugoi.livejournal.com”})




18 мая 2009 г.
PPB::Join
       join_seq
       $seq = join_seq($dbh_seq, $group_seq);
       $seq->shift; # (1000, {
                    #          url => “http://dolboeb.livejournal.com”,
                    #          link => “http://ya.ru”
                    #        })
       $seq->shift; # (1017, {
                    #          url => “http://avva.livejournal.com”,
                    #          link => [“http://www.ru”,
                    #                    “http://google.com”
                    #                  ]
                    #        })
       $seq->shift; # (1018, {
                    #          url => ”http://drugoi.livejournal.com”,
                    #          link => “http://mail.ru”
                    # })




18 мая 2009 г.
Пример
       Много роботов с обратной связью
          scheduler.ya.ru                                              db.ya.ru

       /var/lib/link_chunks/*      scheduler_rebuild_stat.pl                feeds
                                           scheduler.pl
                                                                      scheduler_stat
                                    /var/spool/scheduler.log




           robot1.ya.ru               robot2.ya.ru                          robot3.ya.ru
        /var/spool/scheduler.log    /var/spool/scheduler.log   /var/spool/scheduler.log

                   robot.pl                   robot.pl                 robot.pl

             /var/log/links.log         /var/log/links.log        /var/log/links.log


18 мая 2009 г.
18 мая 2009 г.
18 мая 2009 г.
__END__




18 мая 2009 г.
Вячеслав Матюхин
                 Разработчик

                 Россия, Москва,
                 ул. Льва Толстого, 16.

                 +7 (495) 739-00-00
                 +7 (495) 739-70-70 — факс

                 mmcleric@yandex-team.ru




18 мая 2009 г.

Weitere ähnliche Inhalte

Was ist angesagt?

beer web 2.0 promo campaign
beer web 2.0 promo campaignbeer web 2.0 promo campaign
beer web 2.0 promo campaignBrand Switcher
 
SEM на бизнес сайт
SEM на бизнес сайтSEM на бизнес сайт
SEM на бизнес сайтSEOM
 
20070925 Highload2007 Gingist Sigaev
20070925 Highload2007 Gingist Sigaev20070925 Highload2007 Gingist Sigaev
20070925 Highload2007 Gingist SigaevNikolay Samokhvalov
 
Defensive, Cross-Browser Coding with Prototype
Defensive, Cross-Browser Coding with PrototypeDefensive, Cross-Browser Coding with Prototype
Defensive, Cross-Browser Coding with PrototypeAndrew Dupont
 
Оптимизация сайта на Wordpress: темы, плагины, лайфхаки
Оптимизация сайта на Wordpress: темы, плагины, лайфхакиОптимизация сайта на Wordpress: темы, плагины, лайфхаки
Оптимизация сайта на Wordpress: темы, плагины, лайфхакиcollaborator.pro
 
Comtech Line
Comtech LineComtech Line
Comtech Linecomtech
 
Web design book
Web design bookWeb design book
Web design bookYlalt
 
Российско-грузинские отношения: в поисках новых путей развития. Версия на гру...
Российско-грузинские отношения: в поисках новых путей развития. Версия на гру...Российско-грузинские отношения: в поисках новых путей развития. Версия на гру...
Российско-грузинские отношения: в поисках новых путей развития. Версия на гру...Russian Council
 
Lab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationLab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationHaliuka Ganbold
 
Lab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationLab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationHaliuka Ganbold
 
Lab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationLab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationHaliuka Ganbold
 
Lab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationLab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationHaliuka Ganbold
 
1.page maker e book
1.page maker e book1.page maker e book
1.page maker e bookDash Oogii
 

Was ist angesagt? (17)

beer web 2.0 promo campaign
beer web 2.0 promo campaignbeer web 2.0 promo campaign
beer web 2.0 promo campaign
 
Mrr license
Mrr licenseMrr license
Mrr license
 
SEM на бизнес сайт
SEM на бизнес сайтSEM на бизнес сайт
SEM на бизнес сайт
 
20070925 Highload2007 Gingist Sigaev
20070925 Highload2007 Gingist Sigaev20070925 Highload2007 Gingist Sigaev
20070925 Highload2007 Gingist Sigaev
 
Defensive, Cross-Browser Coding with Prototype
Defensive, Cross-Browser Coding with PrototypeDefensive, Cross-Browser Coding with Prototype
Defensive, Cross-Browser Coding with Prototype
 
Оптимизация сайта на Wordpress: темы, плагины, лайфхаки
Оптимизация сайта на Wordpress: темы, плагины, лайфхакиОптимизация сайта на Wordpress: темы, плагины, лайфхаки
Оптимизация сайта на Wordpress: темы, плагины, лайфхаки
 
Comtech Line
Comtech LineComtech Line
Comtech Line
 
Tb nlnt final 2014
Tb nlnt final 2014Tb nlnt final 2014
Tb nlnt final 2014
 
Web design book
Web design bookWeb design book
Web design book
 
Fedoseev Sofs
Fedoseev SofsFedoseev Sofs
Fedoseev Sofs
 
Российско-грузинские отношения: в поисках новых путей развития. Версия на гру...
Российско-грузинские отношения: в поисках новых путей развития. Версия на гру...Российско-грузинские отношения: в поисках новых путей развития. Версия на гру...
Российско-грузинские отношения: в поисках новых путей развития. Версия на гру...
 
Lab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationLab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplication
 
Lab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationLab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplication
 
Lab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationLab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplication
 
Lab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplicationLab2 2 ubuntu-officeapplication
Lab2 2 ubuntu-officeapplication
 
هجاء مصاحف الأمصار
هجاء مصاحف الأمصارهجاء مصاحف الأمصار
هجاء مصاحف الأمصار
 
1.page maker e book
1.page maker e book1.page maker e book
1.page maker e book
 

Andere mochten auch

where the wild webmasters are
where the wild webmasters arewhere the wild webmasters are
where the wild webmasters arePweng Bee
 
Perl в хэке и хэки в Perl
Perl в хэке и хэки в PerlPerl в хэке и хэки в Perl
Perl в хэке и хэки в Perlmayperl
 
Курс Perl в УрГУ
Курс Perl в УрГУКурс Perl в УрГУ
Курс Perl в УрГУmayperl
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perlmayperl
 
Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎mayperl
 
Ведение документации в perl6: POD, да не тот !
Ведение документации в perl6: POD, да не тот !Ведение документации в perl6: POD, да не тот !
Ведение документации в perl6: POD, да не тот !mayperl
 
Wymiana Polsko Włoska 2
Wymiana Polsko Włoska 2Wymiana Polsko Włoska 2
Wymiana Polsko Włoska 2Carlissian
 
Сравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на PerlСравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на Perlmayperl
 
Использование WebMoney в Perl‎
Использование WebMoney в Perl‎Использование WebMoney в Perl‎
Использование WebMoney в Perl‎mayperl
 
Use Perl like Perl
Use Perl like PerlUse Perl like Perl
Use Perl like Perlmayperl
 
Anyevent
AnyeventAnyevent
Anyeventmayperl
 
Perl + nginx = ♥‎
Perl + nginx = ♥‎Perl + nginx = ♥‎
Perl + nginx = ♥‎mayperl
 
IMAGES Foto-Ausstellungen 2011
IMAGES Foto-Ausstellungen 2011IMAGES Foto-Ausstellungen 2011
IMAGES Foto-Ausstellungen 2011edu.support
 
А у нас Perl 6 в production :)
А у нас Perl 6 в production :)А у нас Perl 6 в production :)
А у нас Perl 6 в production :)mayperl
 
The Story of the Bamboo
The Story of the BambooThe Story of the Bamboo
The Story of the BambooPweng Bee
 

Andere mochten auch (16)

where the wild webmasters are
where the wild webmasters arewhere the wild webmasters are
where the wild webmasters are
 
Perl в хэке и хэки в Perl
Perl в хэке и хэки в PerlPerl в хэке и хэки в Perl
Perl в хэке и хэки в Perl
 
Курс Perl в УрГУ
Курс Perl в УрГУКурс Perl в УрГУ
Курс Perl в УрГУ
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perl
 
Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎
 
Prezentacja01
Prezentacja01Prezentacja01
Prezentacja01
 
Ведение документации в perl6: POD, да не тот !
Ведение документации в perl6: POD, да не тот !Ведение документации в perl6: POD, да не тот !
Ведение документации в perl6: POD, да не тот !
 
Wymiana Polsko Włoska 2
Wymiana Polsko Włoska 2Wymiana Polsko Włoska 2
Wymiana Polsko Włoska 2
 
Сравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на PerlСравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на Perl
 
Использование WebMoney в Perl‎
Использование WebMoney в Perl‎Использование WebMoney в Perl‎
Использование WebMoney в Perl‎
 
Use Perl like Perl
Use Perl like PerlUse Perl like Perl
Use Perl like Perl
 
Anyevent
AnyeventAnyevent
Anyevent
 
Perl + nginx = ♥‎
Perl + nginx = ♥‎Perl + nginx = ♥‎
Perl + nginx = ♥‎
 
IMAGES Foto-Ausstellungen 2011
IMAGES Foto-Ausstellungen 2011IMAGES Foto-Ausstellungen 2011
IMAGES Foto-Ausstellungen 2011
 
А у нас Perl 6 в production :)
А у нас Perl 6 в production :)А у нас Perl 6 в production :)
А у нас Perl 6 в production :)
 
The Story of the Bamboo
The Story of the BambooThe Story of the Bamboo
The Story of the Bamboo
 

Mehr von mayperl

‎Тестирование в проекте REG.RU‎
‎Тестирование в проекте REG.RU‎‎Тестирование в проекте REG.RU‎
‎Тестирование в проекте REG.RU‎mayperl
 
Browser sniffing в 21 веке‎
Browser sniffing в 21 веке‎Browser sniffing в 21 веке‎
Browser sniffing в 21 веке‎mayperl
 
Что будет с Перлом?
Что будет с Перлом?Что будет с Перлом?
Что будет с Перлом?mayperl
 
Вебклуб Perlgolf.ru
Вебклуб Perlgolf.ruВебклуб Perlgolf.ru
Вебклуб Perlgolf.rumayperl
 
Making Your Own CPAN
Making Your Own CPANMaking Your Own CPAN
Making Your Own CPANmayperl
 
Упаковка и развертывание программ на perl под debian‎
Упаковка и развертывание программ на perl под debian‎Упаковка и развертывание программ на perl под debian‎
Упаковка и развертывание программ на perl под debian‎mayperl
 
Groovy Vs Perl
Groovy Vs PerlGroovy Vs Perl
Groovy Vs Perlmayperl
 
10.000 вариантов снять квартиру или сам себе POE-риелтор
10.000 вариантов снять квартиру или сам себе POE-риелтор10.000 вариантов снять квартиру или сам себе POE-риелтор
10.000 вариантов снять квартиру или сам себе POE-риелторmayperl
 

Mehr von mayperl (8)

‎Тестирование в проекте REG.RU‎
‎Тестирование в проекте REG.RU‎‎Тестирование в проекте REG.RU‎
‎Тестирование в проекте REG.RU‎
 
Browser sniffing в 21 веке‎
Browser sniffing в 21 веке‎Browser sniffing в 21 веке‎
Browser sniffing в 21 веке‎
 
Что будет с Перлом?
Что будет с Перлом?Что будет с Перлом?
Что будет с Перлом?
 
Вебклуб Perlgolf.ru
Вебклуб Perlgolf.ruВебклуб Perlgolf.ru
Вебклуб Perlgolf.ru
 
Making Your Own CPAN
Making Your Own CPANMaking Your Own CPAN
Making Your Own CPAN
 
Упаковка и развертывание программ на perl под debian‎
Упаковка и развертывание программ на perl под debian‎Упаковка и развертывание программ на perl под debian‎
Упаковка и развертывание программ на perl под debian‎
 
Groovy Vs Perl
Groovy Vs PerlGroovy Vs Perl
Groovy Vs Perl
 
10.000 вариантов снять квартиру или сам себе POE-риелтор
10.000 вариантов снять квартиру или сам себе POE-риелтор10.000 вариантов снять квартиру или сам себе POE-риелтор
10.000 вариантов снять квартиру или сам себе POE-риелтор
 

Распределенная обработка потоковых данных

  • 1. Распределенная обработка потоковых данных Вячеслав Матюхин May Perl, Москва, 16-17 мая 2009 года 18 мая 2009 г.
  • 4. Потоки данных Какими они бывают? • Лог в локальной FS 18 мая 2009 г.
  • 5. Потоки данных Какими они бывают? • Лог в локальной FS • Таблица в БД 18 мая 2009 г.
  • 6. Потоки данных Какими они бывают? • Лог в локальной FS • Таблица в БД • HTTP-поток 18 мая 2009 г.
  • 7. Потоки данных Как обрабатывать? cron VS Демоны - асинхронность - синхронность - простота написания - init-скрипт, pid-файл, watchdog - надежность - утечки памяти - интеграция с unix-утилитами 18 мая 2009 г.
  • 8. Потоки данных Логи • Веб-сервера 18 мая 2009 г.
  • 9. Потоки данных Логи • Веб-сервера • Базы данных 18 мая 2009 г.
  • 10. Потоки данных Логи • Веб-сервера • Базы данных • Скрипты 18 мая 2009 г.
  • 11. Потоки данных Логи • Веб-сервера • Базы данных • Скрипты • Модули (log4perl) 18 мая 2009 г.
  • 12. Логи Особенности • Надежность 18 мая 2009 г.
  • 13. Логи Особенности • Надежность • Простота чтения 18 мая 2009 г.
  • 14. Логи Особенности • Надежность • Простота чтения • Ротация! 18 мая 2009 г.
  • 15. Пример Scheduler Будем выкачивать rss. Шедулер будет вести лог /var/spool/scheduler.log: 1000 http://dolboeb.livejournal.com/data/rss 1017 http://avva.livejournal.com/data/rss 1018 http://drugoi.livejournal.com/data/rss ... 18 мая 2009 г.
  • 16. Пример Scheduler scheduler.pl /var/spool/scheduler.log 18 мая 2009 г.
  • 18. Yandex::Unrotate Synopsis use Yandex::Unrotate; my $reader = Yandex::Unrotate->new({ LogFile => “/var/spool/scheduler.log”, PosFile => “/var/lib/robot.pos”, }); while ($reader->readline) { ... } $reader->commit; 18 мая 2009 г.
  • 19. Yandex::Unrotate Synopsis use Yandex::Unrotate; my $reader = Yandex::Unrotate->new({ LogFile => “/var/spool/scheduler.log”, PosFile => “/var/lib/robot.pos”, }); while ($reader->readline) { ... } $reader->commit; 18 мая 2009 г.
  • 20. Yandex::Unrotate Synopsis use Yandex::Unrotate; my $reader = Yandex::Unrotate->new({ LogFile => “/var/spool/scheduler.log”, PosFile => “/var/lib/robot.pos”, }); while ($reader->readline) { ... } $reader->commit; 18 мая 2009 г.
  • 21. Yandex::Unrotate Synopsis use Yandex::Unrotate; my $reader = Yandex::Unrotate->new({ LogFile => “/var/spool/scheduler.log”, PosFile => “/var/lib/robot.pos”, }); while ($reader->readline) { ... } $reader->commit; 18 мая 2009 г.
  • 22. Yandex::Unrotate Synopsis use Yandex::Unrotate; my $reader = Yandex::Unrotate->new({ LogFile => “/var/spool/scheduler.log”, PosFile => “/var/lib/robot.pos”, }); while ($reader->readline) { ... } $reader->commit; 18 мая 2009 г.
  • 23. Пример Робот robot.ya.ru scheduler.pl /var/spool/scheduler.log robot.pl 18 мая 2009 г.
  • 24. Yandex::Unrotate Возможности • CheckInode 18 мая 2009 г.
  • 25. Yandex::Unrotate Возможности • CheckInode • CheckLastline 18 мая 2009 г.
  • 26. Yandex::Unrotate Возможности • CheckInode • CheckLastline • ->commit(); ->commit($position); 18 мая 2009 г.
  • 27. Yandex::Unrotate Возможности • CheckInode • CheckLastline • ->commit(); ->commit($position); • ->lag(); 18 мая 2009 г.
  • 28. Yandex::Unrotate Возможности • CheckInode • CheckLastline • ->commit(); ->commit($position); • ->lag(); Ближайший аналог: File::LogReader 18 мая 2009 г.
  • 29. Yandex::Unrotate Файл состояния file: /var/spool/scheduler.log position: 120000 inode: 4815162342 lastline: 21903 http://tema.livejournal.com/data/rss 18 мая 2009 г.
  • 30. Yandex::Unrotate Файл состояния file: /var/spool/scheduler.log position: 120000 inode: 4815162342 lastline: 21903 http://tema.livejournal.com/data/rss $ unrotate -n 10 robot.pos $ unrotate -n 10 --commit robot.pos 18 мая 2009 г.
  • 31. Yandex::Unrotate А распараллелить? $reader = Yandex::Unrotate::Chunk->new( LogFile => “/var/spool/scheduler.log”, PosFile => “/var/lib/robot.pos”, ChunkDir => “/var/lib/robot/chunks/”, ChunkCount => 5, ChunkSize => 5000, ); # откусить новый chunk или взять свободный существующий while ($reader->readline) { ... } $reader->commit; # стереть chunk 18 мая 2009 г.
  • 32. Пример Робот с chunk’ами robot.ya.ru scheduler.pl /var/spool/scheduler.log robot.pl /var/spool/robot/chunks/chunk1 robot.pl /var/spool/robot/chunks/chunk2 robot.pl /var/spool/robot/chunks/chunk3 18 мая 2009 г.
  • 33. Yandex::Unrotate Мониторинг • Да здравствует Log::Log4perl! 18 мая 2009 г.
  • 34. Yandex::Unrotate Мониторинг • Да здравствует Log::Log4perl! • /var/log/unrotate/failures.log 18 мая 2009 г.
  • 35. Yandex::Unrotate Мониторинг • Да здравствует Log::Log4perl! • /var/log/unrotate/failures.log • ...и /var/log/unrotate/failures.pos 18 мая 2009 г.
  • 36. А если машин много? 18 мая 2009 г.
  • 37. Расссылка данных propagate system(qq{cat $tmpfile | ssh robot1 ‘accept scheduler.log’}); # или: system(q{tar c index | ssh search-host ‘accept index.tar}); 18 мая 2009 г.
  • 38. Рассылка данных accept my $fname = shift @ARGV or die quot;missing fnamequot;; @modules = ( (grep { ! m#.[^/]*$# } glob quot;/etc/accept.d/*quot;), ); for (@modules) { my $object = do ($_); warn $@ if $@; push @objects, $object if $object; } for my $object (@objects) { exit(0) if $object->process($fname); } die quot;no module to process $fnamequot;; 18 мая 2009 г.
  • 39. Расссылка данных propagate.d $ cat /etc/propagate.d/scheduler { LogFile => “/var/spool/scheduler.log”, PosFile => “/var/lib/propagate.pos”, Acceptors => [ { Host => “robot1”, Key => “/var/lib/ppb_key.rsa”, User => “ppb”, }, { Host => “robot2”, Key => “/var/lib/ppb_key.rsa”, User => “ppb”, }, ], Limit => 5000, } 18 мая 2009 г.
  • 40. Расссылка данных propagate.d Или так: $ cat /etc/propagate.d/scheduler { LogFile => “/var/spool/scheduler.log”, PosFile => “/var/lib/propagate.pos”, Acceptors => connectdb(“meta”)->selectall_arrayref(q{ SELECT host AS Host, “ppb” AS User, “/var/lib/ppb-key.rsa” AS Key FROM RobotHosts }, { Slice => {} }), Limit => 5000, } 18 мая 2009 г.
  • 41. Пример Много роботов scheduler.ya.ru scheduler.pl /var/spool/scheduler.log robot1.ya.ru robot2.ya.ru robot3.ya.ru /var/spool/scheduler.log /var/spool/scheduler.log /var/spool/scheduler.log robot.pl robot.pl robot.pl 18 мая 2009 г.
  • 43. PPB::Join Для работы с отсортированными потоками • из файла • из базы • из памяти 18 мая 2009 г.
  • 44. PPB::Join file_seq $seq = file_seq(xopen(“/var/log/robot/links.log”); print $seq->shift; # 1000 http://ya.ru print $seq->shift; # 1017 http://www.ru print $seq->shift; # 1017 http://google.com print $seq->shift; # 1018 http://mail.ru 18 мая 2009 г.
  • 45. PPB::Join map_seq $seq = map_seq(sub {shift =~ /^(d+)t(S+)$/}, $file_seq); $seq->shift; # (1000, “http://ya.ru”) $seq->shift; # (1017, “http://www.ru”) $seq->shift; # (1017, “http://google.com”) $seq->shift; # (1018, “http://mail.ru”) 18 мая 2009 г.
  • 46. PPB::Join split_seq $seq = split_seq($file_seq, “link”, qr/t/); $seq->shift; # (1000, {link => “http://ya.ru”}) $seq->shift; # (1017, {link => “http://www.ru”}) $seq->shift; # (1017, {link => “http://google.com”}) $seq->shift; # (1018, {link => “http://mail.ru”}) 18 мая 2009 г.
  • 47. PPB::Join group_seq $seq = group_seq($dbh_seq); $seq->shift; # (1000, {link => [“http://ya.ru”]}) $seq->shift; # (1017, {link => [“http://www.ru”, # “http://google.com”]}) $seq->shift; # (1018, {link => “http://mail.ru”}) 18 мая 2009 г.
  • 48. PPB::Join dbh_seq $seq = dbh_seq( $db->prepare(“select id, url from feeds”), “id” ); $seq->shift; # (1000, {url => “http://dolboeb.livejournal.com”}) $seq->shift; # (1017, {url => “http://avva.livejournal.com”}) $seq->shift; # (1018, {url => “http://drugoi.livejournal.com”}) 18 мая 2009 г.
  • 49. PPB::Join join_seq $seq = join_seq($dbh_seq, $group_seq); $seq->shift; # (1000, { # url => “http://dolboeb.livejournal.com”, # link => “http://ya.ru” # }) $seq->shift; # (1017, { # url => “http://avva.livejournal.com”, # link => [“http://www.ru”, # “http://google.com” # ] # }) $seq->shift; # (1018, { # url => ”http://drugoi.livejournal.com”, # link => “http://mail.ru” # }) 18 мая 2009 г.
  • 50. Пример Много роботов с обратной связью scheduler.ya.ru db.ya.ru /var/lib/link_chunks/* scheduler_rebuild_stat.pl feeds scheduler.pl scheduler_stat /var/spool/scheduler.log robot1.ya.ru robot2.ya.ru robot3.ya.ru /var/spool/scheduler.log /var/spool/scheduler.log /var/spool/scheduler.log robot.pl robot.pl robot.pl /var/log/links.log /var/log/links.log /var/log/links.log 18 мая 2009 г.
  • 54. Вячеслав Матюхин Разработчик Россия, Москва, ул. Льва Толстого, 16. +7 (495) 739-00-00 +7 (495) 739-70-70 — факс mmcleric@yandex-team.ru 18 мая 2009 г.