Top Banner
Распределенная обработка потоковых данных May Perl, Москва, 16-17 мая 2009 года Вячеслав Матюхин 18 мая 2009 г.
54

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

Nov 16, 2014

Download

Technology

mayperl

YAPC Russia 2009 "May Perl 2"
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Распределенная обработка потоковых данных

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

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

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

18 мая 2009 г.

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

18 мая 2009 г.

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

Потоки данных

18 мая 2009 г.

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

Потоки данных

• Лог в локальной FS

Какими они бывают?

18 мая 2009 г.

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

Какими они бывают?Потоки данных

• Лог в локальной FS

• Таблица в БД

18 мая 2009 г.

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

Потоки данных

• Лог в локальной FS

• Таблица в БД

• HTTP-поток

Какими они бывают?

18 мая 2009 г.

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

Демоны

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

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

- утечки памяти

Потоки данныхКак обрабатывать?

cron

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

- простота написания

- надежность

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

VS

18 мая 2009 г.

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

Потоки данных

• Веб-сервера

Логи

18 мая 2009 г.

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

Потоки данных

• Веб-сервера

• Базы данных

Логи

18 мая 2009 г.

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

Потоки данных

• Веб-сервера

• Базы данных

• Скрипты

Логи

18 мая 2009 г.

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

Потоки данных

• Веб-сервера

• Базы данных

• Скрипты

• Модули (log4perl)

Логи

18 мая 2009 г.

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

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

18 мая 2009 г.

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

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

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

18 мая 2009 г.

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

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

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

• Ротация!

18 мая 2009 г.

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

SchedulerПример

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

1000 http://dolboeb.livejournal.com/data/rss1017 http://avva.livejournal.com/data/rss1018 http://drugoi.livejournal.com/data/rss...

18 мая 2009 г.

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

SchedulerПример

scheduler.pl /var/spool/scheduler.log

18 мая 2009 г.

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

Yandex::Unrotate

18 мая 2009 г.

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

SynopsisYandex::Unrotate

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 г.

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

SynopsisYandex::Unrotate

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 г.

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

SynopsisYandex::Unrotate

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 г.

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

SynopsisYandex::Unrotate

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 г.

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

SynopsisYandex::Unrotate

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 г.

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

РоботПример

scheduler.pl

/var/spool/scheduler.log

robot.pl

robot.ya.ru

18 мая 2009 г.

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

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

• CheckInode

18 мая 2009 г.

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

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

• CheckInode• CheckLastline

18 мая 2009 г.

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

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

• CheckInode• CheckLastline• ->commit(); ->commit($position);

18 мая 2009 г.

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

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

• CheckInode• CheckLastline• ->commit(); ->commit($position);• ->lag();

18 мая 2009 г.

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

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

• CheckInode• CheckLastline• ->commit(); ->commit($position);• ->lag();

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

18 мая 2009 г.

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

file: /var/spool/scheduler.logposition: 120000inode: 4815162342lastline: 21903 http://tema.livejournal.com/data/rss

Файл состоянияYandex::Unrotate

18 мая 2009 г.

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

file: /var/spool/scheduler.logposition: 120000inode: 4815162342lastline: 21903 http://tema.livejournal.com/data/rss

Файл состоянияYandex::Unrotate

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

18 мая 2009 г.

Page 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 г.

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

Робот с chunk’ами Пример

scheduler.pl /var/spool/scheduler.log

robot.pl

robot.pl

robot.pl

/var/spool/robot/chunks/chunk1

/var/spool/robot/chunks/chunk2

/var/spool/robot/chunks/chunk3

robot.ya.ru

18 мая 2009 г.

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

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

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

18 мая 2009 г.

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

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

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

• /var/log/unrotate/failures.log

18 мая 2009 г.

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

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

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

• /var/log/unrotate/failures.log

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

18 мая 2009 г.

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

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

18 мая 2009 г.

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

propagateРасссылка данных

system(qq{cat $tmpfile | ssh robot1 ‘accept scheduler.log’});# или:system(q{tar c index | ssh search-host ‘accept index.tar});

18 мая 2009 г.

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

acceptРассылка данных

my $fname = shift @ARGV or die "missing fname";

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

die "no module to process $fname";

18 мая 2009 г.

Page 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 г.

Page 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 г.

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

Много роботовПример

scheduler.pl

/var/spool/scheduler.log

/var/spool/scheduler.log

robot.pl

/var/spool/scheduler.log

robot.pl

/var/spool/scheduler.log

robot.pl

scheduler.ya.ru

robot1.ya.ru robot2.ya.ru robot3.ya.ru

18 мая 2009 г.

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

PPB::Join

18 мая 2009 г.

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

• из файла

• из базы

• из памяти

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

18 мая 2009 г.

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

PPB::Join

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

file_seq

18 мая 2009 г.

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

PPB::Join

$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”)

map_seq

18 мая 2009 г.

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

PPB::Join

$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”})

split_seq

18 мая 2009 г.

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

PPB::Join

$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”})

group_seq

18 мая 2009 г.

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

PPB::Join

$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”})

dbh_seq

18 мая 2009 г.

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

PPB::Join

$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” # })

join_seq

18 мая 2009 г.

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

robot3.ya.rurobot2.ya.ru

robot.pl

Много роботов с обратной связьюПример

scheduler.pl

/var/spool/scheduler.log

/var/spool/scheduler.log

robot.pl

/var/spool/scheduler.log /var/spool/scheduler.log

scheduler.ya.ru

robot1.ya.ru

robot.pl

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

/var/lib/link_chunks/* scheduler_rebuild_stat.pl

db.ya.ru

feeds

scheduler_stat

18 мая 2009 г.

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

18 мая 2009 г.

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

18 мая 2009 г.

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

__END__

18 мая 2009 г.

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

Разработчик

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

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

[email protected]

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

18 мая 2009 г.