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

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


           May Perl, Москва, 16-17 мая ...
18 мая 2009 г.
Потоки данных




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




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

           • Таблица в БД




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

           • Таблица в БД

           • HTTP-...
Потоки данных
           Как обрабатывать?
                 cron        VS             Демоны

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




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

           • Базы данных




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

           • Базы данных

           • Скрипты




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

           • Базы данных

           • Скрипты

           • Модул...
Логи
          Особенности
           • Надежность




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

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




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

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

           • Ротация!




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

        ...
Пример
          Scheduler


                 scheduler.pl   /var/spool/scheduler.log




18 мая 2009 г.
Yandex::Unrotate




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

          my $reader = Yandex::Unrotate->new({
         ...
Yandex::Unrotate
       Synopsis
          use Yandex::Unrotate;

          my $reader = Yandex::Unrotate->new({
         ...
Yandex::Unrotate
       Synopsis
          use Yandex::Unrotate;

          my $reader = Yandex::Unrotate->new({
         ...
Yandex::Unrotate
       Synopsis
          use Yandex::Unrotate;

          my $reader = Yandex::Unrotate->new({
         ...
Yandex::Unrotate
       Synopsis
          use Yandex::Unrotate;

          my $reader = Yandex::Unrotate->new({
         ...
Пример
          Робот
                 robot.ya.ru
                                    scheduler.pl

                    ...
Yandex::Unrotate
       Возможности
       • CheckInode




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




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

...
Yandex::Unrotate
       Возможности
       • CheckInode
       • CheckLastline
       • ->commit(); ->commit($position);
 ...
Yandex::Unrotate
       Возможности
       • CheckInode
       • CheckLastline
       • ->commit(); ->commit($position);
 ...
Yandex::Unrotate
       Файл состояния
          file: /var/spool/scheduler.log
          position: 120000
          inode...
Yandex::Unrotate
       Файл состояния
          file: /var/spool/scheduler.log
          position: 120000
          inode...
Yandex::Unrotate
       А распараллелить?
          $reader = Yandex::Unrotate::Chunk->new(
            LogFile => “/var/s...
Пример
          Робот с chunk’ами
                 robot.ya.ru



                   scheduler.pl   /var/spool/scheduler....
Yandex::Unrotate
       Мониторинг

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




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

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

       • /var/log/unrotate/failures.log




18...
Yandex::Unrotate
       Мониторинг

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

       • /var/log/unrotate/failures.log

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




18 мая 2009 г.
Расссылка данных
       propagate
         system(qq{cat $tmpfile | ssh robot1 ‘accept scheduler.log’});
         # или:
 ...
Рассылка данных
       accept
          my $fname = shift @ARGV or die quot;missing fnamequot;;

          @modules = (
  ...
Расссылка данных
       propagate.d
          $ cat /etc/propagate.d/scheduler
          {
            LogFile => “/var/sp...
Расссылка данных
       propagate.d
          Или так:
          $ cat /etc/propagate.d/scheduler
          {
            ...
Пример
       Много роботов
                                   scheduler.ya.ru

                                          ...
PPB::Join




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

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




...
PPB::Join
       file_seq

          $seq = file_seq(xopen(“/var/log/robot/links.log”);
          print $seq->shift; # 1000...
PPB::Join
       map_seq

          $seq = map_seq(sub {shift =~ /^(d+)t(S+)$/}, $file_seq);
          $seq->shift; # (100...
PPB::Join
       split_seq

          $seq = split_seq($file_seq,   “link”, qr/t/);
          $seq->shift; # (1000, {link ...
PPB::Join
       group_seq

          $seq = group_seq($dbh_seq);
          $seq->shift; # (1000, {link => [“http://ya.ru”...
PPB::Join
       dbh_seq

     $seq = dbh_seq(
        $db->prepare(“select id,   url from feeds”),
        “id”
     );
 ...
PPB::Join
       join_seq
       $seq = join_seq($dbh_seq, $group_seq);
       $seq->shift; # (1000, {
                   ...
Пример
       Много роботов с обратной связью
          scheduler.ya.ru                                              db.ya...
18 мая 2009 г.
18 мая 2009 г.
__END__




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

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

 ...
Upcoming SlideShare
Loading in …5
×

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

1,098 views

Published on

YAPC Russia 2009 "May Perl 2"

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

  • Be the first to like this

No Downloads
Views
Total views
1,098
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Распределенная обработка потоковых данных Вячеслав Матюхин May Perl, Москва, 16-17 мая 2009 года 18 мая 2009 г.
  2. 2. 18 мая 2009 г.
  3. 3. Потоки данных 18 мая 2009 г.
  4. 4. Потоки данных Какими они бывают? • Лог в локальной FS 18 мая 2009 г.
  5. 5. Потоки данных Какими они бывают? • Лог в локальной FS • Таблица в БД 18 мая 2009 г.
  6. 6. Потоки данных Какими они бывают? • Лог в локальной FS • Таблица в БД • HTTP-поток 18 мая 2009 г.
  7. 7. Потоки данных Как обрабатывать? cron VS Демоны - асинхронность - синхронность - простота написания - init-скрипт, pid-файл, watchdog - надежность - утечки памяти - интеграция с unix-утилитами 18 мая 2009 г.
  8. 8. Потоки данных Логи • Веб-сервера 18 мая 2009 г.
  9. 9. Потоки данных Логи • Веб-сервера • Базы данных 18 мая 2009 г.
  10. 10. Потоки данных Логи • Веб-сервера • Базы данных • Скрипты 18 мая 2009 г.
  11. 11. Потоки данных Логи • Веб-сервера • Базы данных • Скрипты • Модули (log4perl) 18 мая 2009 г.
  12. 12. Логи Особенности • Надежность 18 мая 2009 г.
  13. 13. Логи Особенности • Надежность • Простота чтения 18 мая 2009 г.
  14. 14. Логи Особенности • Надежность • Простота чтения • Ротация! 18 мая 2009 г.
  15. 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. 16. Пример Scheduler scheduler.pl /var/spool/scheduler.log 18 мая 2009 г.
  17. 17. Yandex::Unrotate 18 мая 2009 г.
  18. 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. 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. 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. 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. 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. 23. Пример Робот robot.ya.ru scheduler.pl /var/spool/scheduler.log robot.pl 18 мая 2009 г.
  24. 24. Yandex::Unrotate Возможности • CheckInode 18 мая 2009 г.
  25. 25. Yandex::Unrotate Возможности • CheckInode • CheckLastline 18 мая 2009 г.
  26. 26. Yandex::Unrotate Возможности • CheckInode • CheckLastline • ->commit(); ->commit($position); 18 мая 2009 г.
  27. 27. Yandex::Unrotate Возможности • CheckInode • CheckLastline • ->commit(); ->commit($position); • ->lag(); 18 мая 2009 г.
  28. 28. Yandex::Unrotate Возможности • CheckInode • CheckLastline • ->commit(); ->commit($position); • ->lag(); Ближайший аналог: File::LogReader 18 мая 2009 г.
  29. 29. Yandex::Unrotate Файл состояния file: /var/spool/scheduler.log position: 120000 inode: 4815162342 lastline: 21903 http://tema.livejournal.com/data/rss 18 мая 2009 г.
  30. 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. 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. 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. 33. Yandex::Unrotate Мониторинг • Да здравствует Log::Log4perl! 18 мая 2009 г.
  34. 34. Yandex::Unrotate Мониторинг • Да здравствует Log::Log4perl! • /var/log/unrotate/failures.log 18 мая 2009 г.
  35. 35. Yandex::Unrotate Мониторинг • Да здравствует Log::Log4perl! • /var/log/unrotate/failures.log • ...и /var/log/unrotate/failures.pos 18 мая 2009 г.
  36. 36. А если машин много? 18 мая 2009 г.
  37. 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. 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. 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. 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. 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 г.
  42. 42. PPB::Join 18 мая 2009 г.
  43. 43. PPB::Join Для работы с отсортированными потоками • из файла • из базы • из памяти 18 мая 2009 г.
  44. 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. 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. 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. 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. 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. 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. 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 г.
  51. 51. 18 мая 2009 г.
  52. 52. 18 мая 2009 г.
  53. 53. __END__ 18 мая 2009 г.
  54. 54. Вячеслав Матюхин Разработчик Россия, Москва, ул. Льва Толстого, 16. +7 (495) 739-00-00 +7 (495) 739-70-70 — факс mmcleric@yandex-team.ru 18 мая 2009 г.

×