Распределенная обработка потоковых данных
-
Upload
mayperl -
Category
Technology
-
view
1.523 -
download
0
description
Transcript of Распределенная обработка потоковых данных
![Page 1: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/1.jpg)
Распределенная обработка потоковых данных
May Perl, Москва, 16-17 мая 2009 года
Вячеслав Матюхин
18 мая 2009 г.
![Page 2: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/2.jpg)
18 мая 2009 г.
![Page 3: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/3.jpg)
Потоки данных
18 мая 2009 г.
![Page 4: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/4.jpg)
Потоки данных
• Лог в локальной FS
Какими они бывают?
18 мая 2009 г.
![Page 5: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/5.jpg)
Какими они бывают?Потоки данных
• Лог в локальной FS
• Таблица в БД
18 мая 2009 г.
![Page 6: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/6.jpg)
Потоки данных
• Лог в локальной FS
• Таблица в БД
• HTTP-поток
Какими они бывают?
18 мая 2009 г.
![Page 7: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/7.jpg)
Демоны
- синхронность
- init-скрипт, pid-файл, watchdog
- утечки памяти
Потоки данныхКак обрабатывать?
cron
- асинхронность
- простота написания
- надежность
- интеграция с unix-утилитами
VS
18 мая 2009 г.
![Page 8: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/8.jpg)
Потоки данных
• Веб-сервера
Логи
18 мая 2009 г.
![Page 9: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/9.jpg)
Потоки данных
• Веб-сервера
• Базы данных
Логи
18 мая 2009 г.
![Page 10: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/10.jpg)
Потоки данных
• Веб-сервера
• Базы данных
• Скрипты
Логи
18 мая 2009 г.
![Page 11: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/11.jpg)
Потоки данных
• Веб-сервера
• Базы данных
• Скрипты
• Модули (log4perl)
Логи
18 мая 2009 г.
![Page 12: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/12.jpg)
ЛогиОсобенности• Надежность
18 мая 2009 г.
![Page 13: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/13.jpg)
ЛогиОсобенности• Надежность
• Простота чтения
18 мая 2009 г.
![Page 14: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/14.jpg)
ЛогиОсобенности• Надежность
• Простота чтения
• Ротация!
18 мая 2009 г.
![Page 15: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/15.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/16.jpg)
SchedulerПример
scheduler.pl /var/spool/scheduler.log
18 мая 2009 г.
![Page 17: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/17.jpg)
Yandex::Unrotate
18 мая 2009 г.
![Page 18: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/18.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/19.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/20.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/21.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/22.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/23.jpg)
РоботПример
scheduler.pl
/var/spool/scheduler.log
robot.pl
robot.ya.ru
18 мая 2009 г.
![Page 24: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/24.jpg)
ВозможностиYandex::Unrotate
• CheckInode
18 мая 2009 г.
![Page 25: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/25.jpg)
ВозможностиYandex::Unrotate
• CheckInode• CheckLastline
18 мая 2009 г.
![Page 26: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/26.jpg)
ВозможностиYandex::Unrotate
• CheckInode• CheckLastline• ->commit(); ->commit($position);
18 мая 2009 г.
![Page 27: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/27.jpg)
ВозможностиYandex::Unrotate
• CheckInode• CheckLastline• ->commit(); ->commit($position);• ->lag();
18 мая 2009 г.
![Page 28: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/28.jpg)
ВозможностиYandex::Unrotate
• CheckInode• CheckLastline• ->commit(); ->commit($position);• ->lag();
Ближайший аналог: File::LogReader
18 мая 2009 г.
![Page 29: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/29.jpg)
file: /var/spool/scheduler.logposition: 120000inode: 4815162342lastline: 21903 http://tema.livejournal.com/data/rss
Файл состоянияYandex::Unrotate
18 мая 2009 г.
![Page 30: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/30.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/31.jpg)
А распараллелить?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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/32.jpg)
Робот с 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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/33.jpg)
МониторингYandex::Unrotate
• Да здравствует Log::Log4perl!
18 мая 2009 г.
![Page 34: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/34.jpg)
МониторингYandex::Unrotate
• Да здравствует Log::Log4perl!
• /var/log/unrotate/failures.log
18 мая 2009 г.
![Page 35: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/35.jpg)
МониторингYandex::Unrotate
• Да здравствует Log::Log4perl!
• /var/log/unrotate/failures.log
• ...и /var/log/unrotate/failures.pos
18 мая 2009 г.
![Page 36: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/36.jpg)
А если машин много?
18 мая 2009 г.
![Page 37: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/37.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/38.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/39.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/40.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/41.jpg)
Много роботовПример
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/42.jpg)
PPB::Join
18 мая 2009 г.
![Page 43: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/43.jpg)
• из файла
• из базы
• из памяти
Для работы с отсортированными потокамиPPB::Join
18 мая 2009 г.
![Page 44: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/44.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/45.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/46.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/47.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/48.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/49.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/50.jpg)
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: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/51.jpg)
18 мая 2009 г.
![Page 52: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/52.jpg)
18 мая 2009 г.
![Page 53: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/53.jpg)
__END__
18 мая 2009 г.
![Page 54: Распределенная обработка потоковых данных](https://reader036.fdocument.pub/reader036/viewer/2022081400/5468c40caf795981018b5394/html5/thumbnails/54.jpg)
Разработчик
Россия, Москва,ул. Льва Толстого, 16.
+7 (495) 739-00-00+7 (495) 739-70-70 — факс
Вячеслав Матюхин
18 мая 2009 г.