SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
Социальный граф
«Одноклассников» в myTarget
Олег Царёв, ведущий разработчик myTarget
myTarget
•  Платформа таргетированной рекламы
•  Более 70 таргетингов (пол, возраст,
регион, …, установленные приложения,
поисковые запросы)
•  «Одноклассники», «Вконтакте», «Мой
Мир», …
•  Огромные нагрузки
О чём этот доклад
Социальный граф
«Одноклассников»
+
myTarget
О чём этот доклад
•  Социальный граф
«Одноклассников» + myTarget
•  Можно ли из этого получить деньги?
•  Каким именно образом?
•  Какие технические проблемы
придётся решить?
Пара слов о докладчике
•  Ведущий разработчик проекта
•  Отвечает на вопросы «Как?», «Почему?»,
«Сколько?», «Где?»
•  Оптимизирует узкие места
•  Обучает коллег, руководит коллегами
•  Пилил три разных СУБД (в том числе MySQL)
•  Подслушивает в курилке умных людей
•  Имеет вредный характер
Постановка задачи
"У нас есть задача использовать социальный граф
пользователя в рекламе. Первая модельная задача, которую
мы хотим решить - показывать пользователю, кто из его
друзей играет в какую-то игру (например, в ту, в которую
зашел сейчас пользователь или которую мы рекламируем).
Мы хотим иметь возможность получить эту информацию
очень быстро, т.к. хотим получить ее прямо во время
выполнения запроса, не подготавливая при этом обширно
данные.
Исходно у нас есть набор пользователей, для каждого
пользователя известен список его друзей и игр, в которые
он играет."
Результат
Результат
Результат
Это очень простая задача
#!/usr/bin/env python
friends = {1: [2,3], 2: [1], … }
games = {1: [game1], 2: [game2], …}
wp = defaultdict(defaultdict([]))
ok_id = 1
for friend_id in friends[ok_id]:
for game in games[friend_id]:
wp[ok_id][game].append(friend_id)
Технические требования
•  Десятки* тысяч запросов в секунду
•  Максимальное время ответа – единицы
миллисекунд
•  Чем меньше требуется ресурсов – тем лучше
Дружба: общая информация
•  Социальный граф
•  Вершины: 200 миллионов пользователей
•  Рёбра: 13 миллиардов связей
•  Граф импортируется в виде лога обновлений
•  По логу обновлений можно получить
состояние графа в любой момент времени
•  Граф используется для других задач
•  Размер лога за всё время: 1.2 терабайт
•  Ежедневные обновления: 380 мегабайт
Дружба: как устроены события
События со следующими атрибутами:
•  event_id: монотонно возрастает
•  event_type:
•  A – связь добавилась
•  D – связь удалена
•  ok_id_1: кто дружит
•  ok_id_2: с кем дружит
•  timestamp: когда связь поменялась
•  Есть другие атрибуты (исключил из
рассмотрения)
Дружба: актуальный статус связи
Как узнать: дружат два пользователя или нет?
1.  Найти все события (ok_id_1, ok_id_2)
2.  Отсортировать по timestamp
3.  Состояние связи: event_type последнего –
состояние связи
•  Может поступить timestamp из прошлого (!)
•  События могут дублироваться (!)
•  Для обновления графа нужно хранить
последнее (по timestamp) обновление и
удалённые связи
Дружба: различные представления графа
•  Обновляемое представление:
•  живые связи: 360 гигабайт
•  удалённые связи: 173 гигабайта
•  всего: 533 гигабайта
•  Необновляемое представление:
•  Список рёбер: 200 гигабайт
•  Списки смежных вершин: 90 гигабайт
Игры: общая информация
•  Исходные данные – лог посещения страниц с
игрой пользователями:
(ok_id, game, timestamp)
•  Лог за два месяца: 1.5 терабайта
•  Если агрегировать: 20 гигабайт
Ключевые вопросы
•  Как хранить граф?
•  Как обновлять граф?
•  Как хранить игры пользователей?
•  Как обновлять игры пользователей?
•  Как выбирать игры друзей?
•  Как уложиться в таймауты?
•  Как выдержать необходимую нагрузку?
Ключевые вопросы
•  Группа вопросов №1
•  Как хранить граф?
•  Как обновлять граф?
•  Как хранить игры пользователей?
•  Как обновлять игры пользователей?
•  Группа вопросов №2
•  Как выбирать игры друзей?
•  Как уложиться в таймауты?
•  Как выдержать необходимую нагрузку?
Ключевые вопросы
•  Хранение (вычисления)
•  Как хранить граф?
•  Как обновлять граф?
•  Как хранить игры пользователей?
•  Как обновлять игры пользователей?
•  Доставка
•  Как выбирать игры друзей?
•  Как уложиться в таймауты?
•  Как выдержать необходимую нагрузку?
Возможные решения
•  Графовые базы данных
•  Реляционные СУБД
•  MySQL: join + group by
•  PostgreSQL: CTE / WITH … RECURSIVE BY
•  NoSQL: Tarantool
•  Собственное решение
•  HDFS / Hadoop
Графовые базы данных
•  http://www.highload.ru/2014/abstracts/1611.html
•  Чудовищно медленный импорт данных
•  Поиск соседей вершины – больше секунды.
•  Ни у кого в команде нет опыта эксплуатации и
использования.
•  Непрогнозируемый результат и время
разработки.
•  Условно годится (?) для хранение
•  Не годится для доставка
Реляционные СУБД: PostgreSQL
•  http://www.slideshare.net/quipo/rdbms-in-the-
social-networks-age
•  Шикарно! Хочу попробовать.
•  Нет опыта эксплуатации PostgreSQL L
•  Не рискнул ввязываться.
•  Расчёт - всего один запрос.
•  Идеально для хранение (вычисления)
•  Едва ли подойдет для доставка
•  Нужно тестировать
Реляционные СУБД: MySQL (хранение)
•  Если коротко: даже не пытайтесь
•  >500 миллионов ключей: падение
скорости записи примерно в 20-25 раз
•  За две недели так и не смогли выгрузить
•  200 миллионов ключей, 65 партиций...
•  Больше 20 партиций => дохнет
•  Для хранение не годится вообще L
Реляционные СУБД: MySQL (доставка)
MySQL и HandlerSocket на 1/128 части графа
•  Все данные в памяти
•  6 CPU (+6 HT) – 100% использование
•  MySQL 30 krps
•  HandlerSocket 120krps
•  MySQL: 99/95/90 frac: 100/41/19 мc
•  HandlerSocket: 99/95/90 frac: 100/41/19 мc
•  Каши не сваришь L
•  Для доставка не годится
Собственное решение
•  Начинающие программисты любят долго
писать Очень Универсальные Решения,
которые используются ровно в одном проекте
ровно до тех пор, пока программист не
уволится из проекта (а потом Очень
Универсальное Решение с облегчением
выпилят).
•  У меня профдеформация: писал OLAP, OLTP и
NoSQL СУБД.
•  И оценил срок разработки прототипа в 4
человеко-месяца минимум.
HDFS & Hadoop
•  Широко используется в myTarget
•  Группа Data Mining делает
умопомрачительные штуки
•  http://www.highload.ru/2014/abstracts/1596.html
•  Все данные уже там
•  Прямой расчёт данных – почти сутки L
•  Я смог это обойти (но про это позже)
•  Идеально для хранения (вычисления)
•  Не годится вообще для доставка
Tarantool
•  Широко используется в myTarget
•  Persistent, In Memory, Low Latency
•  http://tarantool.org/
•  Бенчмарк: 1 ядро, 100% загрузка
•  120 krps
•  99/95/90 frac: 6/3/2 мc
•  Если пошардить – ещё меньше
•  Идеален для доставка
•  Хранение - 533 гигабайта RAM?...
Очевидное решение
•  Считаем граф на hadoop (~90 гигабайт)
•  Считаем игры на hadoop (~20 гигабайта)
•  Заливаем в tarantool
1.  вытаскиваем друзей пользователя:
•  ok_id è [friend_id]
2.  вытаскиваем игры друзей
•  friend_idè [game]
3.  Вытаскиваем имя и фамилию друга
•  friend_idè {first name, surname}
Анализ и оценка
•  У пользователей несколько* сот друзей в
среднем
•  Шаг 1: одно хождение в тарантулы
•  Шаг 2: несколько* сотен запросов, одно
хождение
•  Шаг 3: единицы запросов, одно хождение
•  X * 10 KRPS * 100-500 друзей =
в лучшем случае 1..5X миллионов RPS (!)
Проблемы
•  3 хождения (3-4 мс) – слишком долго!
•  Десятки* миллионов запросов – слишком
много!
•  Не хватит сети
•  Не хватит CPU
•  Нужно искать другой путь L
Менее очевидное решение
•  Считаем граф на hadoop (~90 Гб)
•  Считаем игры на hadoop (~20 Гб)
•  Считаем на hadoop игры друзей (~ 400 Гб)
•  Заливаем в tarantool
1.  вытаскиваем игры друзей пользователя:
•  ok_id è [{game, [friend_id]}]
2.  вытаскиваем имя и фамилию друга
•  friend_id è {first name, surname}
Анализ и оценка
•  Два хождения – жить можно (1-2 мс)
•  400 Гб RAM – многовато L
•  Сетевой траффик большой (сеть лагала)
•  Но уже работало почти как хотелось
•  Почему бы не усечь данные?
Усечение данных – попытка 1
•  «Давайте игнорировать дружелюбных (>1000
друзей) пользователей»
•  Проблема: Иван Ургант дружит с >1200
пользователей
•  «Ургант играет в эту игру? Я тоже хочу»
•  На самом деле Иван Ургант не играет в игры
на Одноклассники (это просто контпример)
•  И всё равно ничего не усекается L
Усечение данных – попытка 2
•  «Давайте хранить лишь для активных
пользователей»
•  Пока проверял – нашёл баг у ОК и два у нас
•  Недельная аудитория – десятки* миллионов
пользователей
•  Их друзья – почти все пользователи
«Одноклассников» è нужно обрабатывать
полный граф
•  Так тоже не получится L
Усечение данных – попытка 3
•  «Давайте хранить информацию для
рекламируемых игр»
•  Всё равно если нет рекламы è нет показов è
не нужна информация
•  Количество игр уменьшилось почти в 20 раз
•  И ещё один небольшой трюк, про него позже
•  Итоговые данные занимают 70 гигабайт
•  …
•  Un tequila, por favor!
Выводы
•  Хороший фильтр данных экономит немало
ресурсов
•  Искать ответ нужно не в программировании, а
в предметной области
•  Данный фильтр уменьшил объём данных J
•  Ясно как представлять данные для доставка
•  Осталось разобраться с вычислениями
Вычисления: эксперименты
•  Полный граф считался почти 20 часов
•  После кучи оптимизаций – в районе 12 часов
•  Игры сначала 8 часов, потом 1 час
•  Игры друзей – почти 16 часов
•  Hadoop постоянно умирал
•  Вокруг моего стола висело облако мата и
проклятий
•  Решение нашлось, но не сразу
•  Решение: инкрементальные вычисления
Концепция поколений
•  Как рассчитывать инкрементально граф?
•  Давайте каждый цикл расчёта маркировать
«поколением»
•  Считаем лишь новые данные
•  Результаты – новое поколение
•  Разница между поколениями 1..X и X+1 –
дельта
•  По дельте обновляем tarantool
•  Sounds like a plan!
Данные в tarantool
message WhoPlay.Game {
// название игры
optional string game = 1;
// число играющих друзей
optional uint32 friends_count = 2;
// ok_id некоторых играющих друзей
repeated uint64 friend_id_list = 3;
}
message WhoPlay.Data {
// информация по играм
repeated Game games = 1;
}
Обновление данных в tarantool
message WhoPlay.Update {
// ok_id пользователя
optional uint64 user_id = 1;
// список игр, для которых больше нет who
play
repeated string deleted = 2;
// обновления / добавление информации по
играм
repeated Game games = 3;
}
Друзья
Расчёт: ok_id => { GENERATION: X,
FRIENDS: [friend_id]}
Дельта: ok_id => { ADDED: [friend_id],
DELETED: [friend_id],
KEEP: [friend_id]}
Игры
Расчёт: ok_id => { GENERATION: X,
GAMES: [game]}
Дельта: ok_id => { ADDED: [game],
DELETED: [game],
KEEP: [game]}
Соединение
ok_id => { ADDED: {[friend_id], [game]}
DELETED: {[friend_id], [game]}
KEEP: {[friend_id], [game]}}
Инверсия связей
friend_id => {
game: {ADDED: [ok_id],
DELETED: [ok_id],
KEEP: [ok_id]}
}
•  Последний штрих: из списка играющих в игру друзей
случайным образом выбираем пять, остальные
выкидываем (для большинства пользователей не
выкидывает ничего, но вот отдельных странных
порезало основательно)
Результаты: хранение (вычисление)
•  Порядка 600 гигабайт HDFS
•  Порядка 8 часов цикл расчёта
•  Порядка 2 часов заливка в tarantool
•  Пересчитываем раз в сутки
•  Высокая волатильность данных: 20%
•  Работает стабильно
•  4.5 KLOC python
Результаты: доставка
•  <80 GB RAM
•  <1 ms response time
•  десятки тысяч запросов в секунду
Результаты: бизнес
•  Живёт на двух серверах
•  Повышает CTR
•  В confluence осталось куча документов
от research
•  Получен бесценный опыт
•  Зарабатывает деньги
•  Этот доклад
Выводы
•  Начинайте с аналитики
•  Делайте бенчмарки
•  Сверяйтесь с техническими
требованиями
•  Сверяйтесь с бизнес-требованиями
•  Не пытайтесь найти серебряную пулю
•  Не пытайтесь изобретать велосипед
Вопросы?
Личный: oleg@oleg.sh
Рабочий: o.tsarev@corp.mail.ru
Facebook: http://facebook.com/oleg.i.tsarev
Проект: http://mytarget.my.com/

Contenu connexe

Tendances

Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)Ontico
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДNikolay Samokhvalov
 
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Ontico
 
Как устроен NoSQL, Андрей Аксенов (Sphinx)
Как устроен NoSQL, Андрей Аксенов (Sphinx)Как устроен NoSQL, Андрей Аксенов (Sphinx)
Как устроен NoSQL, Андрей Аксенов (Sphinx)Ontico
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)Ontico
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Ontico
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Ontico
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...IT-Portfolio
 
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)Ontico
 
Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)Ontico
 
Цена абстракции, Андрей Аксёнов (Sphinx)
Цена абстракции, Андрей Аксёнов (Sphinx)Цена абстракции, Андрей Аксёнов (Sphinx)
Цена абстракции, Андрей Аксёнов (Sphinx)Ontico
 
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Ontico
 
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)Ontico
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Николай Лавлинский
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Ontico
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Fwdays
 
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)Ontico
 
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)Ontico
 
Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поискAndrew Aksyonoff
 
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данныхОлег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данныхSiel01
 

Tendances (20)

Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБД
 
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
 
Как устроен NoSQL, Андрей Аксенов (Sphinx)
Как устроен NoSQL, Андрей Аксенов (Sphinx)Как устроен NoSQL, Андрей Аксенов (Sphinx)
Как устроен NoSQL, Андрей Аксенов (Sphinx)
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
 
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
Как поддерживать и развивать пачку "похожих" проектов. Кластер или конгломера...
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
 
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
 
Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)Всему своё время / Роман Ивлиев (Банки.ру)
Всему своё время / Роман Ивлиев (Банки.ру)
 
Цена абстракции, Андрей Аксёнов (Sphinx)
Цена абстракции, Андрей Аксёнов (Sphinx)Цена абстракции, Андрей Аксёнов (Sphinx)
Цена абстракции, Андрей Аксёнов (Sphinx)
 
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
 
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"
 
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
 
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
 
Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поиск
 
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данныхОлег Царев, Кирилл Коринский   Сравнительный анализ хранилищ данных
Олег Царев, Кирилл Коринский Сравнительный анализ хранилищ данных
 

En vedette

Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013it-people
 
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...odnoklassniki.ru
 
Класс!ная Cassandra
Класс!ная CassandraКласс!ная Cassandra
Класс!ная Cassandraodnoklassniki.ru
 
"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)AvitoTech
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandraodnoklassniki.ru
 
Зачем в Avito Аналитика?
Зачем в Avito Аналитика?Зачем в Avito Аналитика?
Зачем в Avito Аналитика?AvitoTech
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)AvitoTech
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?tfmailru
 
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Ontico
 
Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...Ontico
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Ontico
 
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...Ontico
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Ontico
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooMail.ru Group
 
Golang в avito
Golang в avitoGolang в avito
Golang в avitoAvitoTech
 
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)AvitoTech
 
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)AvitoTech
 
Архитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахАрхитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахDmitry Buzdin
 

En vedette (19)

Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
 
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
 
Класс!ная Cassandra
Класс!ная CassandraКласс!ная Cassandra
Класс!ная Cassandra
 
"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
 
Зачем в Avito Аналитика?
Зачем в Avito Аналитика?Зачем в Avito Аналитика?
Зачем в Avito Аналитика?
 
HBase on Dev{Highload}
HBase on Dev{Highload}HBase on Dev{Highload}
HBase on Dev{Highload}
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
 
Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
 
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
 
Golang в avito
Golang в avitoGolang в avito
Golang в avito
 
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
 
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
 
Архитектура Ленты на Одноклассниках
Архитектура Ленты на ОдноклассникахАрхитектура Ленты на Одноклассниках
Архитектура Ленты на Одноклассниках
 

Similaire à Cоциальный граф "Одноклассников" в myTarget

CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest
 
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...Mad Devs
 
Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...Ontico
 
BigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationBigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationAnton Gorokhov
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновOntico
 
Thumbtack Expertise Days # 5 - Dataset
Thumbtack Expertise Days # 5 - DatasetThumbtack Expertise Days # 5 - Dataset
Thumbtack Expertise Days # 5 - DatasetAlexey Remnev
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
Спасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераСпасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераDaniel Podolsky
 
Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...Ontico
 
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) АксеновAlex Chistyakov
 
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
Как сделать веб-карту, сохранить здоровье и возненавидеть IEКак сделать веб-карту, сохранить здоровье и возненавидеть IE
Как сделать веб-карту, сохранить здоровье и возненавидеть IEАртём Кудзев
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеBadoo Development
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеYulia Kotova
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеAlexandr Krasheninnikov
 
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...Ontico
 
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...Ontico
 
Александр Шарак, "Одноклассники"
Александр Шарак, "Одноклассники"Александр Шарак, "Одноклассники"
Александр Шарак, "Одноклассники"Ontico
 
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)Ontico
 
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)Badoo Development
 

Similaire à Cоциальный граф "Одноклассников" в myTarget (20)

CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем SphinxCodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
CodeFest 2012. Аксёнов А. — Как мы разрабатываем Sphinx
 
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
 
Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...
 
BigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationBigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: Personalization
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
Thumbtack Expertise Days # 5 - Dataset
Thumbtack Expertise Days # 5 - DatasetThumbtack Expertise Days # 5 - Dataset
Thumbtack Expertise Days # 5 - Dataset
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
Спасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераСпасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного Хецнера
 
Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...
 
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
 
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
Как сделать веб-карту, сохранить здоровье и возненавидеть IEКак сделать веб-карту, сохранить здоровье и возненавидеть IE
Как сделать веб-карту, сохранить здоровье и возненавидеть IE
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
Near-realtime аналитика событий в высоконагруженном проекте / Александр Краше...
 
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
Слон желтого цвета и его друзья (эксплуатация Hadoop-стека в федеральном прое...
 
Александр Шарак, "Одноклассники"
Александр Шарак, "Одноклассники"Александр Шарак, "Одноклассники"
Александр Шарак, "Одноклассники"
 
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
 
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)Использование Hadoop в Badoo, Валерий Старынин (Badoo)
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
 

Cоциальный граф "Одноклассников" в myTarget

  • 1. Социальный граф «Одноклассников» в myTarget Олег Царёв, ведущий разработчик myTarget
  • 2. myTarget •  Платформа таргетированной рекламы •  Более 70 таргетингов (пол, возраст, регион, …, установленные приложения, поисковые запросы) •  «Одноклассники», «Вконтакте», «Мой Мир», … •  Огромные нагрузки
  • 3. О чём этот доклад Социальный граф «Одноклассников» + myTarget
  • 4. О чём этот доклад •  Социальный граф «Одноклассников» + myTarget •  Можно ли из этого получить деньги? •  Каким именно образом? •  Какие технические проблемы придётся решить?
  • 5. Пара слов о докладчике •  Ведущий разработчик проекта •  Отвечает на вопросы «Как?», «Почему?», «Сколько?», «Где?» •  Оптимизирует узкие места •  Обучает коллег, руководит коллегами •  Пилил три разных СУБД (в том числе MySQL) •  Подслушивает в курилке умных людей •  Имеет вредный характер
  • 6. Постановка задачи "У нас есть задача использовать социальный граф пользователя в рекламе. Первая модельная задача, которую мы хотим решить - показывать пользователю, кто из его друзей играет в какую-то игру (например, в ту, в которую зашел сейчас пользователь или которую мы рекламируем). Мы хотим иметь возможность получить эту информацию очень быстро, т.к. хотим получить ее прямо во время выполнения запроса, не подготавливая при этом обширно данные. Исходно у нас есть набор пользователей, для каждого пользователя известен список его друзей и игр, в которые он играет."
  • 10. Это очень простая задача #!/usr/bin/env python friends = {1: [2,3], 2: [1], … } games = {1: [game1], 2: [game2], …} wp = defaultdict(defaultdict([])) ok_id = 1 for friend_id in friends[ok_id]: for game in games[friend_id]: wp[ok_id][game].append(friend_id)
  • 11. Технические требования •  Десятки* тысяч запросов в секунду •  Максимальное время ответа – единицы миллисекунд •  Чем меньше требуется ресурсов – тем лучше
  • 12. Дружба: общая информация •  Социальный граф •  Вершины: 200 миллионов пользователей •  Рёбра: 13 миллиардов связей •  Граф импортируется в виде лога обновлений •  По логу обновлений можно получить состояние графа в любой момент времени •  Граф используется для других задач •  Размер лога за всё время: 1.2 терабайт •  Ежедневные обновления: 380 мегабайт
  • 13. Дружба: как устроены события События со следующими атрибутами: •  event_id: монотонно возрастает •  event_type: •  A – связь добавилась •  D – связь удалена •  ok_id_1: кто дружит •  ok_id_2: с кем дружит •  timestamp: когда связь поменялась •  Есть другие атрибуты (исключил из рассмотрения)
  • 14. Дружба: актуальный статус связи Как узнать: дружат два пользователя или нет? 1.  Найти все события (ok_id_1, ok_id_2) 2.  Отсортировать по timestamp 3.  Состояние связи: event_type последнего – состояние связи •  Может поступить timestamp из прошлого (!) •  События могут дублироваться (!) •  Для обновления графа нужно хранить последнее (по timestamp) обновление и удалённые связи
  • 15. Дружба: различные представления графа •  Обновляемое представление: •  живые связи: 360 гигабайт •  удалённые связи: 173 гигабайта •  всего: 533 гигабайта •  Необновляемое представление: •  Список рёбер: 200 гигабайт •  Списки смежных вершин: 90 гигабайт
  • 16. Игры: общая информация •  Исходные данные – лог посещения страниц с игрой пользователями: (ok_id, game, timestamp) •  Лог за два месяца: 1.5 терабайта •  Если агрегировать: 20 гигабайт
  • 17. Ключевые вопросы •  Как хранить граф? •  Как обновлять граф? •  Как хранить игры пользователей? •  Как обновлять игры пользователей? •  Как выбирать игры друзей? •  Как уложиться в таймауты? •  Как выдержать необходимую нагрузку?
  • 18. Ключевые вопросы •  Группа вопросов №1 •  Как хранить граф? •  Как обновлять граф? •  Как хранить игры пользователей? •  Как обновлять игры пользователей? •  Группа вопросов №2 •  Как выбирать игры друзей? •  Как уложиться в таймауты? •  Как выдержать необходимую нагрузку?
  • 19. Ключевые вопросы •  Хранение (вычисления) •  Как хранить граф? •  Как обновлять граф? •  Как хранить игры пользователей? •  Как обновлять игры пользователей? •  Доставка •  Как выбирать игры друзей? •  Как уложиться в таймауты? •  Как выдержать необходимую нагрузку?
  • 20. Возможные решения •  Графовые базы данных •  Реляционные СУБД •  MySQL: join + group by •  PostgreSQL: CTE / WITH … RECURSIVE BY •  NoSQL: Tarantool •  Собственное решение •  HDFS / Hadoop
  • 21. Графовые базы данных •  http://www.highload.ru/2014/abstracts/1611.html •  Чудовищно медленный импорт данных •  Поиск соседей вершины – больше секунды. •  Ни у кого в команде нет опыта эксплуатации и использования. •  Непрогнозируемый результат и время разработки. •  Условно годится (?) для хранение •  Не годится для доставка
  • 22. Реляционные СУБД: PostgreSQL •  http://www.slideshare.net/quipo/rdbms-in-the- social-networks-age •  Шикарно! Хочу попробовать. •  Нет опыта эксплуатации PostgreSQL L •  Не рискнул ввязываться. •  Расчёт - всего один запрос. •  Идеально для хранение (вычисления) •  Едва ли подойдет для доставка •  Нужно тестировать
  • 23. Реляционные СУБД: MySQL (хранение) •  Если коротко: даже не пытайтесь •  >500 миллионов ключей: падение скорости записи примерно в 20-25 раз •  За две недели так и не смогли выгрузить •  200 миллионов ключей, 65 партиций... •  Больше 20 партиций => дохнет •  Для хранение не годится вообще L
  • 24. Реляционные СУБД: MySQL (доставка) MySQL и HandlerSocket на 1/128 части графа •  Все данные в памяти •  6 CPU (+6 HT) – 100% использование •  MySQL 30 krps •  HandlerSocket 120krps •  MySQL: 99/95/90 frac: 100/41/19 мc •  HandlerSocket: 99/95/90 frac: 100/41/19 мc •  Каши не сваришь L •  Для доставка не годится
  • 25. Собственное решение •  Начинающие программисты любят долго писать Очень Универсальные Решения, которые используются ровно в одном проекте ровно до тех пор, пока программист не уволится из проекта (а потом Очень Универсальное Решение с облегчением выпилят). •  У меня профдеформация: писал OLAP, OLTP и NoSQL СУБД. •  И оценил срок разработки прототипа в 4 человеко-месяца минимум.
  • 26. HDFS & Hadoop •  Широко используется в myTarget •  Группа Data Mining делает умопомрачительные штуки •  http://www.highload.ru/2014/abstracts/1596.html •  Все данные уже там •  Прямой расчёт данных – почти сутки L •  Я смог это обойти (но про это позже) •  Идеально для хранения (вычисления) •  Не годится вообще для доставка
  • 27. Tarantool •  Широко используется в myTarget •  Persistent, In Memory, Low Latency •  http://tarantool.org/ •  Бенчмарк: 1 ядро, 100% загрузка •  120 krps •  99/95/90 frac: 6/3/2 мc •  Если пошардить – ещё меньше •  Идеален для доставка •  Хранение - 533 гигабайта RAM?...
  • 28. Очевидное решение •  Считаем граф на hadoop (~90 гигабайт) •  Считаем игры на hadoop (~20 гигабайта) •  Заливаем в tarantool 1.  вытаскиваем друзей пользователя: •  ok_id è [friend_id] 2.  вытаскиваем игры друзей •  friend_idè [game] 3.  Вытаскиваем имя и фамилию друга •  friend_idè {first name, surname}
  • 29. Анализ и оценка •  У пользователей несколько* сот друзей в среднем •  Шаг 1: одно хождение в тарантулы •  Шаг 2: несколько* сотен запросов, одно хождение •  Шаг 3: единицы запросов, одно хождение •  X * 10 KRPS * 100-500 друзей = в лучшем случае 1..5X миллионов RPS (!)
  • 30. Проблемы •  3 хождения (3-4 мс) – слишком долго! •  Десятки* миллионов запросов – слишком много! •  Не хватит сети •  Не хватит CPU •  Нужно искать другой путь L
  • 31. Менее очевидное решение •  Считаем граф на hadoop (~90 Гб) •  Считаем игры на hadoop (~20 Гб) •  Считаем на hadoop игры друзей (~ 400 Гб) •  Заливаем в tarantool 1.  вытаскиваем игры друзей пользователя: •  ok_id è [{game, [friend_id]}] 2.  вытаскиваем имя и фамилию друга •  friend_id è {first name, surname}
  • 32. Анализ и оценка •  Два хождения – жить можно (1-2 мс) •  400 Гб RAM – многовато L •  Сетевой траффик большой (сеть лагала) •  Но уже работало почти как хотелось •  Почему бы не усечь данные?
  • 33. Усечение данных – попытка 1 •  «Давайте игнорировать дружелюбных (>1000 друзей) пользователей» •  Проблема: Иван Ургант дружит с >1200 пользователей •  «Ургант играет в эту игру? Я тоже хочу» •  На самом деле Иван Ургант не играет в игры на Одноклассники (это просто контпример) •  И всё равно ничего не усекается L
  • 34. Усечение данных – попытка 2 •  «Давайте хранить лишь для активных пользователей» •  Пока проверял – нашёл баг у ОК и два у нас •  Недельная аудитория – десятки* миллионов пользователей •  Их друзья – почти все пользователи «Одноклассников» è нужно обрабатывать полный граф •  Так тоже не получится L
  • 35. Усечение данных – попытка 3 •  «Давайте хранить информацию для рекламируемых игр» •  Всё равно если нет рекламы è нет показов è не нужна информация •  Количество игр уменьшилось почти в 20 раз •  И ещё один небольшой трюк, про него позже •  Итоговые данные занимают 70 гигабайт •  … •  Un tequila, por favor!
  • 36. Выводы •  Хороший фильтр данных экономит немало ресурсов •  Искать ответ нужно не в программировании, а в предметной области •  Данный фильтр уменьшил объём данных J •  Ясно как представлять данные для доставка •  Осталось разобраться с вычислениями
  • 37. Вычисления: эксперименты •  Полный граф считался почти 20 часов •  После кучи оптимизаций – в районе 12 часов •  Игры сначала 8 часов, потом 1 час •  Игры друзей – почти 16 часов •  Hadoop постоянно умирал •  Вокруг моего стола висело облако мата и проклятий •  Решение нашлось, но не сразу •  Решение: инкрементальные вычисления
  • 38. Концепция поколений •  Как рассчитывать инкрементально граф? •  Давайте каждый цикл расчёта маркировать «поколением» •  Считаем лишь новые данные •  Результаты – новое поколение •  Разница между поколениями 1..X и X+1 – дельта •  По дельте обновляем tarantool •  Sounds like a plan!
  • 39. Данные в tarantool message WhoPlay.Game { // название игры optional string game = 1; // число играющих друзей optional uint32 friends_count = 2; // ok_id некоторых играющих друзей repeated uint64 friend_id_list = 3; } message WhoPlay.Data { // информация по играм repeated Game games = 1; }
  • 40. Обновление данных в tarantool message WhoPlay.Update { // ok_id пользователя optional uint64 user_id = 1; // список игр, для которых больше нет who play repeated string deleted = 2; // обновления / добавление информации по играм repeated Game games = 3; }
  • 41. Друзья Расчёт: ok_id => { GENERATION: X, FRIENDS: [friend_id]} Дельта: ok_id => { ADDED: [friend_id], DELETED: [friend_id], KEEP: [friend_id]}
  • 42. Игры Расчёт: ok_id => { GENERATION: X, GAMES: [game]} Дельта: ok_id => { ADDED: [game], DELETED: [game], KEEP: [game]}
  • 43. Соединение ok_id => { ADDED: {[friend_id], [game]} DELETED: {[friend_id], [game]} KEEP: {[friend_id], [game]}}
  • 44. Инверсия связей friend_id => { game: {ADDED: [ok_id], DELETED: [ok_id], KEEP: [ok_id]} } •  Последний штрих: из списка играющих в игру друзей случайным образом выбираем пять, остальные выкидываем (для большинства пользователей не выкидывает ничего, но вот отдельных странных порезало основательно)
  • 45. Результаты: хранение (вычисление) •  Порядка 600 гигабайт HDFS •  Порядка 8 часов цикл расчёта •  Порядка 2 часов заливка в tarantool •  Пересчитываем раз в сутки •  Высокая волатильность данных: 20% •  Работает стабильно •  4.5 KLOC python
  • 46. Результаты: доставка •  <80 GB RAM •  <1 ms response time •  десятки тысяч запросов в секунду
  • 47. Результаты: бизнес •  Живёт на двух серверах •  Повышает CTR •  В confluence осталось куча документов от research •  Получен бесценный опыт •  Зарабатывает деньги •  Этот доклад
  • 48. Выводы •  Начинайте с аналитики •  Делайте бенчмарки •  Сверяйтесь с техническими требованиями •  Сверяйтесь с бизнес-требованиями •  Не пытайтесь найти серебряную пулю •  Не пытайтесь изобретать велосипед
  • 49. Вопросы? Личный: oleg@oleg.sh Рабочий: o.tsarev@corp.mail.ru Facebook: http://facebook.com/oleg.i.tsarev Проект: http://mytarget.my.com/