Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

40 50+ 500+ 1500 млн человек суммарная аудитория группы количество изданий, сервисов и проектов разработчиков человек в хорошей компании

Slide 3

Slide 3 text

Livejournal Gazeta.ru Begun Price Ferra Redigo Letidor Канобу Видео Секрет фирмы Рамблер Инфографика Новости Почта Финансы Недвижимость Погода Гороскопы Субботний Рамблер Путешествия Касса Еда Город Воздух Волна Рестораны Мослента Lenta.ru Афиша Motor Championat Quto Рамблер Видеостудия

Slide 4

Slide 4 text

Языки и технологии

Slide 5

Slide 5 text

Контакты В группе компаний Rambler&Co всегда есть открытые вакансии для тех, кто хочет профессионально расти и развиваться, занимаясь тем, что по-настоящему нравится [email protected] www.rambler-co.ru/jobs

Slide 6

Slide 6 text

Social Graph Лев Тонких. Афиша Рестораны

Slide 7

Slide 7 text

Wolfram|Alpha Personal Analytics

Slide 8

Slide 8 text

Статья на Хабре Анализ дружеских связей VK с помощью Wolfram Mathematica “На моих 333 друзьях это заняло 119 секунд” - автор об получении списка общих друзей

Slide 9

Slide 9 text

??? http:// habrahabr.ru/ post/216831/ 119???

Slide 10

Slide 10 text

Wolfram Mathematica

Slide 11

Slide 11 text

Граф дружеских связей VK.COM VK API Получить данные Визуализация графа

Slide 12

Slide 12 text

Что нужно? Python 3.4 requests (lib) d3 (visualization) Firefox (XMLHttpRequest)

Slide 13

Slide 13 text

Standalone/Mobile-приложения Создаем свое Подтверждаем права Попадаем в стр. управления (ID)

Slide 14

Slide 14 text

Авторизация приложения Аутентификации юзера на сайте Разрешение юзером доступа к данным Передача в приложение access_token

Slide 15

Slide 15 text

Используемые методы users.get friends.get friends.getMutual execute

Slide 16

Slide 16 text

Предположим 25 друзей С каждым другом есть 1 общий друг

Slide 17

Slide 17 text

Схема 1

Slide 18

Slide 18 text

Схема 2

Slide 19

Slide 19 text

Схема 3

Slide 20

Slide 20 text

Немного про execute code (VkScript) 25 обращений к методам API

Slide 21

Slide 21 text

Схема 4

Slide 22

Slide 22 text

25 раз! return { API.friends.getMutual({"source_uid":id_s, "target_uid":id_t}), // * 25 };

Slide 23

Slide 23 text

Хранимые процедуры На том же VkScript execute.getMutual?source=id&targets=ids

Slide 24

Slide 24 text

Схема 5

Slide 25

Slide 25 text

Время выполнения 333 друга - 119 сек. VS 348 друзей - 9 сек.

Slide 26

Slide 26 text

Harder, Better, Faster, Stronger

Slide 27

Slide 27 text

Ошибки в доках 'error_msg': 'Access denied: user deactivated', 'error_code': 15 спустя 2 дня: + uid вместо user_id

Slide 28

Slide 28 text

In The End [({Ваш друг}, [{}, {}]),()] Генерим json d3 + добавляем картинки к каждому узлу

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

На этом можно было бы и остановиться

Slide 31

Slide 31 text

Получение списка вглубь 1.14 2.2427 3.223 098 - не конечное значение => Big Data (объем, скорость, многообразие)

Slide 32

Slide 32 text

Слишком медленно Хранимые процедуры не спасают Мнопоточность - быстрее на несколько секунд Нужен MAP REDUCE: Распределенные задачи Ноды/Инстансы

Slide 33

Slide 33 text

Клиенты execute == 25 запросов с одного => 5 клиентов == 125 запросов в секунду Можно обрабатывать ошибки и sleep() Вечный None

Slide 34

Slide 34 text

Remote Procedure Call Главный сервер получает id и код операции Делает запрос на всех друзей -- data data/25(75) -- части Каждую часть доставляем получателю Получатели принимают контакты, делают запросы, возвращают Info поставщику

Slide 35

Slide 35 text

RPC Как только все ответы получены -- объединяем их в один

Slide 36

Slide 36 text

Что нужно Брокер сообщений (Почта) Асинхронная распределенная очередь заданий (Воркеры)

Slide 37

Slide 37 text

Конфигурации

Slide 38

Slide 38 text

Ограничения ВКонтакте 3 з/с с одного id 25 обращений к API => 75 !!! 3-4 токена

Slide 39

Slide 39 text

Итого Переписать 90% кода RPC Брокер Асинхронная очередь Общие друзья / глубинные друзья || запускаем задания, склеиваем ответ

Slide 40

Slide 40 text

Общие друзья 343 за 119с VS 348 за 9с => в 12 раз быстрее 1 воркер: 308 за 4.2с; 2 воркера: за 2с => в 60 раз быстрее

Slide 41

Slide 41 text

Глубинные друзья глубина = 2 ключей 1251 Вначале 17.9с 1 Воркер: 15.1с 2 Воркера: 8.2с

Slide 42

Slide 42 text

Ожидание

Slide 43

Slide 43 text

Сохранение результата Все в оперативной памяти Никаких графо-ориентированных БД Выгрузка/загрузка - pickle

Slide 44

Slide 44 text

Анализ графа matplotlib networkx Метод университета Райса (Rice University) Convert Dictionary Graph Representation into networkx Graph Representation

Slide 45

Slide 45 text

Строим граф 306 вершин 2096 ребер Общие друзья

Slide 46

Slide 46 text

Данные бывают разные Граф глубинных друзей лучше не рисовать 1: 10 2: 1234 ключа, 517 174 id (419 на 1) Количество вершин: 370341 Количество ребер: 512949

Slide 47

Slide 47 text

Связный граф глубина = 1 1268 вершин 1329 ребер

Slide 48

Slide 48 text

Алгоритмы Диаметр, центр, радиус Page Rank Коэффициент кластеризации ...всего 148 алгоритмов networkx.github.io/documentation/ networkx-1.9/reference/algorithms.html

Slide 49

Slide 49 text

Итого Ускорил в 60 раз Можно “модифицировать” Горизонтальное масштабирование Глубинные друзья 148 алгоритмов + можно тестировать и писать свои

Slide 50

Slide 50 text

vk_friends Habrahabr Github

Slide 51

Slide 51 text

Спасибо!