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

Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

Aug 29, 2019

Download

Documents

phunganh
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: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

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

Page 2: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная
Page 3: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 4: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

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

Page 5: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

• Таблица в БД

Page 6: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

• Таблица в БД

• HTTP-поток

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

Page 7: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

Демоны

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

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

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

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

cron

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

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

- надежность

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

VS

Page 8: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

Логи

Page 9: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

• Базы данных

Логи

Page 10: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

• Базы данных

• Скрипты

Логи

Page 11: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

• Базы данных

• Скрипты

• Модули (log4perl)

Логи

Page 12: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 13: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

Page 14: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

• Ротация!

Page 15: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 16: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

SchedulerПример

scheduler.pl /var/spool/scheduler.log

Page 17: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

Yandex::Unrotate

Page 18: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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;

Page 19: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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;

Page 20: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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;

Page 21: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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;

Page 22: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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;

Page 23: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

РоботПример

scheduler.pl

/var/spool/scheduler.log

robot.pl

robot.ya.ru

Page 24: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

• CheckInode

Page 25: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

• CheckInode• CheckLastline

Page 26: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

Page 27: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

Page 28: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

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

Page 29: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

Page 30: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 31: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

А распараллелить?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

Page 32: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

Робот с 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

Page 33: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

Page 34: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

• /var/log/unrotate/failures.log

Page 35: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

• /var/log/unrotate/failures.log

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

Page 36: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 37: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

Page 38: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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";

Page 39: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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,

}

Page 40: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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,

}

Page 41: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

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

Page 42: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

PPB::Join

Page 43: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

• из файла

• из базы

• из памяти

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

Page 44: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 45: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 46: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 47: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 48: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 49: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 50: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

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

Page 51: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная
Page 52: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная
Page 53: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

__END__

Page 54: Распределенная обработка потоковых данныхcache-ash02.cdn.yandex.net/download.yandex.ru/company/experience/Matuhin... · Распределенная

Разработчик

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

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

[email protected]

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