SlideShare a Scribd company logo
1 of 32
Download to read offline
Ефим Пышнограев
Как устроено
API в AppMetrica
Вы узнаете:
› как устроена крупная система аналитики
› какие проблемы возникают при построении отчетов
› как выглядит Reporting API и зачем он нужен
Цели доклада
2
› Система мобильной аналитики
› На рынке с 2013 года
› Более 4 тыс. активных приложений
› Мы установлены более чем на 250 млн. устройств
› Более 12 млрд. событий в сутки
О сервисе
3
Архитектура сервиса
4
Пользователь
Разработчик Java backend
Приложение с SDK
Веб интерфейс
Ядро (C++)
ClickHouse
Агрегированные данные
Что хорошо
〉Все данные есть, отчет строится
мгновенно
Что плохо
〉Только предопределенные отчеты
Хранение данных
5
Сырые данные
〉Можно построить отчет
произвольной сложности
〉Скорость агрегации
становится критичной
Таблица фактов в ClickHouse
› Open source column-oriented DBMS
› Запросы на диалекте SQL
› 48 машин
› 490 Tb сжатых данных
Вспомогательная информация в MySQL
Хранение данных
6
› Каждый хост реплицирован в
разных ДЦ
› Весь кластер разделен на
партиции
› Данные одного приложения
находятся на одной партиции
Устройство кластера ClickHouse
7
ClickHouse поддерживает таблицы с движком Distributed
Запрос в локальную таблицу:
SELECT count() FROM events
Запрос в распределенную таблицу:
SELECT count() FROM events_partition
Локальные и распределенные таблицы
8
~140 столбцов
Пример таблицы фактов
9
Date AppID DeviceID AppPlatform CountryID …
2017-06-01 46 268927106 android 6
2017-06-01 46 1292856823 android 43
2017-06-01 87 5341985450 iOS 0
2017-06-02 22 876028365 windows 43
Раньше:
› Одна таблица events со столбцом EventType
Сейчас:
Таблица под каждый тип события
› Общие события
› Клиентские события
› Атрибуция — клики и установки
› Рассылки push уведомлений
Эволюция хранения данных
10
Используется интерфейсом и клиентами напрямую
Формат языка запросов должен позволять
› Покрывать большинство полезных отчетов
› Скрывать сложность SQL запросов
› Скрывать реальную модель данных
› Эффективно использовать ClickHouse
Язык запросов
11
› Написано на Java
› 6 машин в 3 ДЦ
› Более 200 тыс. запросов в сутки
› Каждый запрос обрабатывает в среднем 100 млн. строк
Reporting API
12
Пример отчета
Количество пользователей приложения с системами iOS и Android с февраля по май 2017 года 13
0
250
500
750
1000
February March April May
iOS Android
Количество пользователей
14
SELECT
uniq(DeviceID) AS users
FROM events_partition
WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’))
id date1 date2 metrics
46 2017-06-01 2017-06-07 e:users
Количество пользователей и событий
15
SELECT
uniq(DeviceID) AS users,
count() AS events
FROM events_partition
WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’))
id date1 date2 metrics
46 2017-06-01 2017-06-07 e:users,e:events
Пользователи по странам
16
SELECT
CountryID AS country,
uniq(DeviceID) AS users
FROM events_partition
WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’))
GROUP BY country
metrics dimensions
e:users e:country
Пользователи с ОС Android по странам
17
SELECT
CountryID AS country,
uniq(DeviceID) AS users
FROM events_partition
WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’))
AND AppPlatform = 'android'
GROUP BY country
metrics dimensions filters
e:users e:country os == ‘android’
1. Запрос отправляется на
произвольный хост партиции
2. Хост отправляет запрос на все
локальные таблицы партиции
3. Все хосты возвращают частичные
агрегаты из своих локальных данных
4. Первый хост соединяет эти
агрегаты и возвращает результат
Запрос в одну распределенную таблицу
18
1
2
3
4
Java backend
› Партиция линейно масштабируется
› Работают очень эффективно
› Нельзя строить сложные сегменты
Запрос в одну распределенную таблицу
19
Пользователи, получившие рассылку
20
SELECT
CountryID AS country,
uniq(DeviceID) AS users
FROM events_partition
WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’))
AND AppPlatform = 'android' AND DeviceID GLOBAL IN (
SELECT DeviceID
FROM push_campaigns_partition
WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’))
AND CampaignID = 888
)
GROUP BY country
metrics dimensions filters
e:users e:country os == ‘android’ and exists pc:device with
(campaign == ‘BlackFriday’)
1. Запрос отправляется на произвольный
хост нужной партиции
2-3. Хост вычисляет внутренний
подзапрос в распределенную таблицу
4. Отправляет внешний запрос на все
хосты вместе с результатом подзапроса
5-6. Получает частичные агрегаты и
соединяет их. Возвращает результат
Запрос с GLOBAL IN
21
1
2
3
4
Java backend
5
6
› При расширении кластера загружается сеть
› Работают менее эффективно
› Можно строить сегменты любой сложности
Запрос с GLOBAL IN
22
Локальность данных по DeviceID
23
SELECT
CountryID AS country,
uniq(DeviceID) AS users
FROM events_partition
WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’))
AND AppPlatform = 'android' AND DeviceID IN (
SELECT DeviceID
FROM push_campaigns
WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’))
AND CampaignID = 888
)
GROUP BY country
metrics dimensions filters
e:users e:country os == ‘android’ and exists pc:device with
(campaign == ‘BlackFriday’)
› Замена глобальных IN и JOIN на локальные ускоряет запросы
и разгружает сеть
› Имеет смысл если почти все наши IN и JOIN происходят по
полю DeviceID
› Но при этом нужно уметь делать перешардирование
Локальность данных по DeviceID
24
Что делать если крупное приложение хочет посмотреть
сложный отчет за несколько лет?
› Движок таблицы MergeTree поддерживает семплирование
› Ключ семплирования должен быть равномерно распределен
Запросы без семплирования и с семплированием
SELECT count() FROM events
SELECT count() * 10 FROM events SAMPLE 1/10
Семплирование в отчетах
25
SELECT count() * 3 FROM events WHERE DeviceID % 3 = 0
SELECT count() * 3 FROM events SAMPLE 1/3
Семплирование в отчетах
26
› Ключ семплирования должен быть одинаковым во всех таблицах
› Ключ должен быть привязан к столбцу, по которому делается IN
Семплирование в отчетах
27
SELECT count() * 10
FROM events
SAMPLE 1/10
WHERE DeviceID IN (
SELECT DeviceID
FROM push_campaigns
SAMPLE 1/10
)
Адаптивное семплирование
28
SELECT
uniq(DeviceID) * (42/13) AS users
FROM events_partition
SAMPLE 13/42
WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’))
accuracy metrics
medium e:users
› Оценить сколько строк будет обработано запросом
› Выставить коэффициент семплирования так, чтобы
обработанных строк стало не больше N
› Делать это быстро
Адаптивное семплирование
29
Если запрос не помещается в память
SELECT … FROM events GROUP BY DeviceID
SELECT … FROM events SAMPLE 1/3 OFFSET 0 GROUP BY DeviceID
SELECT … FROM events SAMPLE 1/3 OFFSET 1/3 GROUP BY DeviceID
SELECT … FROM events SAMPLE 1/3 OFFSET 2/3 GROUP BY DeviceID
Разбиение запроса на части
30
› Мы храним данные в ClickHouse и строим отчеты на лету
› Мы сделали свой DSL для описания отчетов
› Не все отчеты можно выразить через Reporting API
› Есть возможность выгрузки сырых логов
Заключение
31
Ефим Пышнограев
Разработчик
badgersow
graev@yandex-team.ru
Спасибо за внимание!

More Related Content

Similar to Как устроено API в AppMetrica

Ishounkina internet research-projects
Ishounkina internet research-projectsIshounkina internet research-projects
Ishounkina internet research-projectsMedia Gorod
 
Инфостарт. Новые возможности 1С 8.3
Инфостарт. Новые возможности 1С 8.3Инфостарт. Новые возможности 1С 8.3
Инфостарт. Новые возможности 1С 8.3Виктория Литовка
 
Victor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platformsVictor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platformsAndrew Mayorov
 
Sqadays 2010 burmistrov_fomin_20101120(2)
Sqadays 2010 burmistrov_fomin_20101120(2)Sqadays 2010 burmistrov_fomin_20101120(2)
Sqadays 2010 burmistrov_fomin_20101120(2)Alexei Lupan
 
gigaGantt презентация развёрнутая
gigaGantt презентация развёрнутаяgigaGantt презентация развёрнутая
gigaGantt презентация развёрнутаяДаниил Ромашов
 
Splunk - универсальная платформа для работы с любыми данными
Splunk - универсальная платформа для работы с любыми даннымиSplunk - универсальная платформа для работы с любыми данными
Splunk - универсальная платформа для работы с любыми даннымиCleverDATA
 
Informatica Пронет (v.0.3)
Informatica   Пронет (v.0.3)Informatica   Пронет (v.0.3)
Informatica Пронет (v.0.3)Natasha Zaverukha
 
Управление клиентскими данными как инструмент бизнеса ВТБ24. Сценарии использ...
Управление клиентскими данными как инструмент бизнеса ВТБ24. Сценарии использ...Управление клиентскими данными как инструмент бизнеса ВТБ24. Сценарии использ...
Управление клиентскими данными как инструмент бизнеса ВТБ24. Сценарии использ...HFLabs
 
Владимир Заец "GraphQL - новый взгляд на API."
Владимир Заец "GraphQL - новый взгляд на API."Владимир Заец "GraphQL - новый взгляд на API."
Владимир Заец "GraphQL - новый взгляд на API."Fwdays
 
Платформа Cisco Tetration Analytics
Платформа Cisco Tetration AnalyticsПлатформа Cisco Tetration Analytics
Платформа Cisco Tetration AnalyticsCisco Russia
 
Мониторинг приложений ASP.NET на основе сервиса Application Insights
Мониторинг приложений ASP.NET на основе сервиса Application InsightsМониторинг приложений ASP.NET на основе сервиса Application Insights
Мониторинг приложений ASP.NET на основе сервиса Application InsightsCodeFest
 
SQL Server StreamIinsight - data processing in real time
SQL Server StreamIinsight - data processing in real timeSQL Server StreamIinsight - data processing in real time
SQL Server StreamIinsight - data processing in real timeДенис Резник
 
Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011Dmytro Mindra
 
Обеспечение и контроль качества услуг
Обеспечение и контроль качества услугОбеспечение и контроль качества услуг
Обеспечение и контроль качества услугCisco Russia
 
Microsoft: Миграция как возможность для трансформации ИТ
Microsoft: Миграция как возможность для трансформации ИТMicrosoft: Миграция как возможность для трансформации ИТ
Microsoft: Миграция как возможность для трансформации ИТDell_Russia
 
Продукты и решения компании Complex Systems
Продукты и решения компании Complex SystemsПродукты и решения компании Complex Systems
Продукты и решения компании Complex SystemsComplex Systems
 

Similar to Как устроено API в AppMetrica (20)

Ishounkina internet research-projects
Ishounkina internet research-projectsIshounkina internet research-projects
Ishounkina internet research-projects
 
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
 
Инфостарт. Новые возможности 1С 8.3
Инфостарт. Новые возможности 1С 8.3Инфостарт. Новые возможности 1С 8.3
Инфостарт. Новые возможности 1С 8.3
 
Victor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platformsVictor Kuzmin - How to organize service development for several mobile platforms
Victor Kuzmin - How to organize service development for several mobile platforms
 
Sqadays 2010 burmistrov_fomin_20101120(2)
Sqadays 2010 burmistrov_fomin_20101120(2)Sqadays 2010 burmistrov_fomin_20101120(2)
Sqadays 2010 burmistrov_fomin_20101120(2)
 
RST2014_Cheboksary_AyDaMaster
RST2014_Cheboksary_AyDaMasterRST2014_Cheboksary_AyDaMaster
RST2014_Cheboksary_AyDaMaster
 
gigaGantt презентация развёрнутая
gigaGantt презентация развёрнутаяgigaGantt презентация развёрнутая
gigaGantt презентация развёрнутая
 
Splunk - универсальная платформа для работы с любыми данными
Splunk - универсальная платформа для работы с любыми даннымиSplunk - универсальная платформа для работы с любыми данными
Splunk - универсальная платформа для работы с любыми данными
 
Informatica Пронет (v.0.3)
Informatica   Пронет (v.0.3)Informatica   Пронет (v.0.3)
Informatica Пронет (v.0.3)
 
Управление клиентскими данными как инструмент бизнеса ВТБ24. Сценарии использ...
Управление клиентскими данными как инструмент бизнеса ВТБ24. Сценарии использ...Управление клиентскими данными как инструмент бизнеса ВТБ24. Сценарии использ...
Управление клиентскими данными как инструмент бизнеса ВТБ24. Сценарии использ...
 
Владимир Заец "GraphQL - новый взгляд на API."
Владимир Заец "GraphQL - новый взгляд на API."Владимир Заец "GraphQL - новый взгляд на API."
Владимир Заец "GraphQL - новый взгляд на API."
 
DATA CLUSTER
 DATA CLUSTER DATA CLUSTER
DATA CLUSTER
 
Платформа Cisco Tetration Analytics
Платформа Cisco Tetration AnalyticsПлатформа Cisco Tetration Analytics
Платформа Cisco Tetration Analytics
 
Мониторинг приложений ASP.NET на основе сервиса Application Insights
Мониторинг приложений ASP.NET на основе сервиса Application InsightsМониторинг приложений ASP.NET на основе сервиса Application Insights
Мониторинг приложений ASP.NET на основе сервиса Application Insights
 
2011 диплом Чуркин А.А.
2011 диплом Чуркин А.А.2011 диплом Чуркин А.А.
2011 диплом Чуркин А.А.
 
SQL Server StreamIinsight - data processing in real time
SQL Server StreamIinsight - data processing in real timeSQL Server StreamIinsight - data processing in real time
SQL Server StreamIinsight - data processing in real time
 
Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011
 
Обеспечение и контроль качества услуг
Обеспечение и контроль качества услугОбеспечение и контроль качества услуг
Обеспечение и контроль качества услуг
 
Microsoft: Миграция как возможность для трансформации ИТ
Microsoft: Миграция как возможность для трансформации ИТMicrosoft: Миграция как возможность для трансформации ИТ
Microsoft: Миграция как возможность для трансформации ИТ
 
Продукты и решения компании Complex Systems
Продукты и решения компании Complex SystemsПродукты и решения компании Complex Systems
Продукты и решения компании Complex Systems
 

More from AppTractor

ИИ: От Вавилонской башни до чаек на Аляске
ИИ: От Вавилонской башни до чаек на АляскеИИ: От Вавилонской башни до чаек на Аляске
ИИ: От Вавилонской башни до чаек на АляскеAppTractor
 
Игры ВКонтакте: числа, люди, новости
Игры ВКонтакте: числа, люди, новостиИгры ВКонтакте: числа, люди, новости
Игры ВКонтакте: числа, люди, новостиAppTractor
 
Mediakit AppTractor 2017
Mediakit AppTractor 2017Mediakit AppTractor 2017
Mediakit AppTractor 2017AppTractor
 
Android Things и Firebase
Android Things и FirebaseAndroid Things и Firebase
Android Things и FirebaseAppTractor
 
AppMetrica и Auto.ru: +10% к конверсиям бесплатно
AppMetrica и Auto.ru: +10% к конверсиям бесплатноAppMetrica и Auto.ru: +10% к конверсиям бесплатно
AppMetrica и Auto.ru: +10% к конверсиям бесплатноAppTractor
 
Алексей Поспехов: ICONIC CHATBOTS & AI ROADSHOW
Алексей Поспехов: ICONIC CHATBOTS & AI ROADSHOWАлексей Поспехов: ICONIC CHATBOTS & AI ROADSHOW
Алексей Поспехов: ICONIC CHATBOTS & AI ROADSHOWAppTractor
 
Артем Кейдунов: Как создать виртуального ассистента для бизнеса
Артем Кейдунов: Как создать виртуального ассистента для бизнесаАртем Кейдунов: Как создать виртуального ассистента для бизнеса
Артем Кейдунов: Как создать виртуального ассистента для бизнесаAppTractor
 
Юлия Павлова: Мобильный фитнес: как и где используют приложения для занятия ф...
Юлия Павлова: Мобильный фитнес: как и где используют приложения для занятия ф...Юлия Павлова: Мобильный фитнес: как и где используют приложения для занятия ф...
Юлия Павлова: Мобильный фитнес: как и где используют приложения для занятия ф...AppTractor
 
Игорь Шеньшин: Зарубежная закупка трафика
Игорь Шеньшин: Зарубежная закупка трафикаИгорь Шеньшин: Зарубежная закупка трафика
Игорь Шеньшин: Зарубежная закупка трафикаAppTractor
 
Виктория Найда: Детское приложение: что нужно для монетизации
Виктория Найда: Детское приложение: что нужно для монетизацииВиктория Найда: Детское приложение: что нужно для монетизации
Виктория Найда: Детское приложение: что нужно для монетизацииAppTractor
 
Владимир Шрейдер: Как приручить миллениала
Владимир Шрейдер: Как приручить миллениалаВладимир Шрейдер: Как приручить миллениала
Владимир Шрейдер: Как приручить миллениалаAppTractor
 
Илья Ялунин: Оптимизация мобильного трафика на основе продуктовых метрик
Илья Ялунин: Оптимизация мобильного трафика на основе продуктовых метрикИлья Ялунин: Оптимизация мобильного трафика на основе продуктовых метрик
Илья Ялунин: Оптимизация мобильного трафика на основе продуктовых метрикAppTractor
 
Лина Туомас: На чем можно сэкономить, если ты стартап, и чего не надо делать
Лина Туомас: На чем можно сэкономить, если ты стартап, и чего не надо делатьЛина Туомас: На чем можно сэкономить, если ты стартап, и чего не надо делать
Лина Туомас: На чем можно сэкономить, если ты стартап, и чего не надо делатьAppTractor
 
Алексей Новиков: Подписка в мобильном приложении, как способ монетизации
Алексей Новиков: Подписка в мобильном приложении, как способ монетизацииАлексей Новиков: Подписка в мобильном приложении, как способ монетизации
Алексей Новиков: Подписка в мобильном приложении, как способ монетизацииAppTractor
 
Александр Насонов: Стикер-паки для imessage в качестве источника трафика для ...
Александр Насонов: Стикер-паки для imessage в качестве источника трафика для ...Александр Насонов: Стикер-паки для imessage в качестве источника трафика для ...
Александр Насонов: Стикер-паки для imessage в качестве источника трафика для ...AppTractor
 
Денис Мартынцев: Недержание пользователей. Как уменьшить отток аудитории из в...
Денис Мартынцев: Недержание пользователей. Как уменьшить отток аудитории из в...Денис Мартынцев: Недержание пользователей. Как уменьшить отток аудитории из в...
Денис Мартынцев: Недержание пользователей. Как уменьшить отток аудитории из в...AppTractor
 
Геннадий Клячман: Создание мобильных приложений по популярным брендам и их пр...
Геннадий Клячман: Создание мобильных приложений по популярным брендам и их пр...Геннадий Клячман: Создание мобильных приложений по популярным брендам и их пр...
Геннадий Клячман: Создание мобильных приложений по популярным брендам и их пр...AppTractor
 
Вера Карпова: Почему они платят? Как анализ платящих пользователей позволит з...
Вера Карпова: Почему они платят? Как анализ платящих пользователей позволит з...Вера Карпова: Почему они платят? Как анализ платящих пользователей позволит з...
Вера Карпова: Почему они платят? Как анализ платящих пользователей позволит з...AppTractor
 
Питер Якобсен: Мобильная реклама и вовлечение пользователей в звонках - револ...
Питер Якобсен: Мобильная реклама и вовлечение пользователей в звонках - револ...Питер Якобсен: Мобильная реклама и вовлечение пользователей в звонках - револ...
Питер Якобсен: Мобильная реклама и вовлечение пользователей в звонках - револ...AppTractor
 
Игорь Мыслинский: Как поймать пользователя на крючок
Игорь Мыслинский: Как поймать пользователя на крючокИгорь Мыслинский: Как поймать пользователя на крючок
Игорь Мыслинский: Как поймать пользователя на крючокAppTractor
 

More from AppTractor (20)

ИИ: От Вавилонской башни до чаек на Аляске
ИИ: От Вавилонской башни до чаек на АляскеИИ: От Вавилонской башни до чаек на Аляске
ИИ: От Вавилонской башни до чаек на Аляске
 
Игры ВКонтакте: числа, люди, новости
Игры ВКонтакте: числа, люди, новостиИгры ВКонтакте: числа, люди, новости
Игры ВКонтакте: числа, люди, новости
 
Mediakit AppTractor 2017
Mediakit AppTractor 2017Mediakit AppTractor 2017
Mediakit AppTractor 2017
 
Android Things и Firebase
Android Things и FirebaseAndroid Things и Firebase
Android Things и Firebase
 
AppMetrica и Auto.ru: +10% к конверсиям бесплатно
AppMetrica и Auto.ru: +10% к конверсиям бесплатноAppMetrica и Auto.ru: +10% к конверсиям бесплатно
AppMetrica и Auto.ru: +10% к конверсиям бесплатно
 
Алексей Поспехов: ICONIC CHATBOTS & AI ROADSHOW
Алексей Поспехов: ICONIC CHATBOTS & AI ROADSHOWАлексей Поспехов: ICONIC CHATBOTS & AI ROADSHOW
Алексей Поспехов: ICONIC CHATBOTS & AI ROADSHOW
 
Артем Кейдунов: Как создать виртуального ассистента для бизнеса
Артем Кейдунов: Как создать виртуального ассистента для бизнесаАртем Кейдунов: Как создать виртуального ассистента для бизнеса
Артем Кейдунов: Как создать виртуального ассистента для бизнеса
 
Юлия Павлова: Мобильный фитнес: как и где используют приложения для занятия ф...
Юлия Павлова: Мобильный фитнес: как и где используют приложения для занятия ф...Юлия Павлова: Мобильный фитнес: как и где используют приложения для занятия ф...
Юлия Павлова: Мобильный фитнес: как и где используют приложения для занятия ф...
 
Игорь Шеньшин: Зарубежная закупка трафика
Игорь Шеньшин: Зарубежная закупка трафикаИгорь Шеньшин: Зарубежная закупка трафика
Игорь Шеньшин: Зарубежная закупка трафика
 
Виктория Найда: Детское приложение: что нужно для монетизации
Виктория Найда: Детское приложение: что нужно для монетизацииВиктория Найда: Детское приложение: что нужно для монетизации
Виктория Найда: Детское приложение: что нужно для монетизации
 
Владимир Шрейдер: Как приручить миллениала
Владимир Шрейдер: Как приручить миллениалаВладимир Шрейдер: Как приручить миллениала
Владимир Шрейдер: Как приручить миллениала
 
Илья Ялунин: Оптимизация мобильного трафика на основе продуктовых метрик
Илья Ялунин: Оптимизация мобильного трафика на основе продуктовых метрикИлья Ялунин: Оптимизация мобильного трафика на основе продуктовых метрик
Илья Ялунин: Оптимизация мобильного трафика на основе продуктовых метрик
 
Лина Туомас: На чем можно сэкономить, если ты стартап, и чего не надо делать
Лина Туомас: На чем можно сэкономить, если ты стартап, и чего не надо делатьЛина Туомас: На чем можно сэкономить, если ты стартап, и чего не надо делать
Лина Туомас: На чем можно сэкономить, если ты стартап, и чего не надо делать
 
Алексей Новиков: Подписка в мобильном приложении, как способ монетизации
Алексей Новиков: Подписка в мобильном приложении, как способ монетизацииАлексей Новиков: Подписка в мобильном приложении, как способ монетизации
Алексей Новиков: Подписка в мобильном приложении, как способ монетизации
 
Александр Насонов: Стикер-паки для imessage в качестве источника трафика для ...
Александр Насонов: Стикер-паки для imessage в качестве источника трафика для ...Александр Насонов: Стикер-паки для imessage в качестве источника трафика для ...
Александр Насонов: Стикер-паки для imessage в качестве источника трафика для ...
 
Денис Мартынцев: Недержание пользователей. Как уменьшить отток аудитории из в...
Денис Мартынцев: Недержание пользователей. Как уменьшить отток аудитории из в...Денис Мартынцев: Недержание пользователей. Как уменьшить отток аудитории из в...
Денис Мартынцев: Недержание пользователей. Как уменьшить отток аудитории из в...
 
Геннадий Клячман: Создание мобильных приложений по популярным брендам и их пр...
Геннадий Клячман: Создание мобильных приложений по популярным брендам и их пр...Геннадий Клячман: Создание мобильных приложений по популярным брендам и их пр...
Геннадий Клячман: Создание мобильных приложений по популярным брендам и их пр...
 
Вера Карпова: Почему они платят? Как анализ платящих пользователей позволит з...
Вера Карпова: Почему они платят? Как анализ платящих пользователей позволит з...Вера Карпова: Почему они платят? Как анализ платящих пользователей позволит з...
Вера Карпова: Почему они платят? Как анализ платящих пользователей позволит з...
 
Питер Якобсен: Мобильная реклама и вовлечение пользователей в звонках - револ...
Питер Якобсен: Мобильная реклама и вовлечение пользователей в звонках - револ...Питер Якобсен: Мобильная реклама и вовлечение пользователей в звонках - револ...
Питер Якобсен: Мобильная реклама и вовлечение пользователей в звонках - револ...
 
Игорь Мыслинский: Как поймать пользователя на крючок
Игорь Мыслинский: Как поймать пользователя на крючокИгорь Мыслинский: Как поймать пользователя на крючок
Игорь Мыслинский: Как поймать пользователя на крючок
 

Как устроено API в AppMetrica

  • 2. Вы узнаете: › как устроена крупная система аналитики › какие проблемы возникают при построении отчетов › как выглядит Reporting API и зачем он нужен Цели доклада 2
  • 3. › Система мобильной аналитики › На рынке с 2013 года › Более 4 тыс. активных приложений › Мы установлены более чем на 250 млн. устройств › Более 12 млрд. событий в сутки О сервисе 3
  • 4. Архитектура сервиса 4 Пользователь Разработчик Java backend Приложение с SDK Веб интерфейс Ядро (C++) ClickHouse
  • 5. Агрегированные данные Что хорошо 〉Все данные есть, отчет строится мгновенно Что плохо 〉Только предопределенные отчеты Хранение данных 5 Сырые данные 〉Можно построить отчет произвольной сложности 〉Скорость агрегации становится критичной
  • 6. Таблица фактов в ClickHouse › Open source column-oriented DBMS › Запросы на диалекте SQL › 48 машин › 490 Tb сжатых данных Вспомогательная информация в MySQL Хранение данных 6
  • 7. › Каждый хост реплицирован в разных ДЦ › Весь кластер разделен на партиции › Данные одного приложения находятся на одной партиции Устройство кластера ClickHouse 7
  • 8. ClickHouse поддерживает таблицы с движком Distributed Запрос в локальную таблицу: SELECT count() FROM events Запрос в распределенную таблицу: SELECT count() FROM events_partition Локальные и распределенные таблицы 8
  • 9. ~140 столбцов Пример таблицы фактов 9 Date AppID DeviceID AppPlatform CountryID … 2017-06-01 46 268927106 android 6 2017-06-01 46 1292856823 android 43 2017-06-01 87 5341985450 iOS 0 2017-06-02 22 876028365 windows 43
  • 10. Раньше: › Одна таблица events со столбцом EventType Сейчас: Таблица под каждый тип события › Общие события › Клиентские события › Атрибуция — клики и установки › Рассылки push уведомлений Эволюция хранения данных 10
  • 11. Используется интерфейсом и клиентами напрямую Формат языка запросов должен позволять › Покрывать большинство полезных отчетов › Скрывать сложность SQL запросов › Скрывать реальную модель данных › Эффективно использовать ClickHouse Язык запросов 11
  • 12. › Написано на Java › 6 машин в 3 ДЦ › Более 200 тыс. запросов в сутки › Каждый запрос обрабатывает в среднем 100 млн. строк Reporting API 12
  • 13. Пример отчета Количество пользователей приложения с системами iOS и Android с февраля по май 2017 года 13 0 250 500 750 1000 February March April May iOS Android
  • 14. Количество пользователей 14 SELECT uniq(DeviceID) AS users FROM events_partition WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’)) id date1 date2 metrics 46 2017-06-01 2017-06-07 e:users
  • 15. Количество пользователей и событий 15 SELECT uniq(DeviceID) AS users, count() AS events FROM events_partition WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’)) id date1 date2 metrics 46 2017-06-01 2017-06-07 e:users,e:events
  • 16. Пользователи по странам 16 SELECT CountryID AS country, uniq(DeviceID) AS users FROM events_partition WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’)) GROUP BY country metrics dimensions e:users e:country
  • 17. Пользователи с ОС Android по странам 17 SELECT CountryID AS country, uniq(DeviceID) AS users FROM events_partition WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’)) AND AppPlatform = 'android' GROUP BY country metrics dimensions filters e:users e:country os == ‘android’
  • 18. 1. Запрос отправляется на произвольный хост партиции 2. Хост отправляет запрос на все локальные таблицы партиции 3. Все хосты возвращают частичные агрегаты из своих локальных данных 4. Первый хост соединяет эти агрегаты и возвращает результат Запрос в одну распределенную таблицу 18 1 2 3 4 Java backend
  • 19. › Партиция линейно масштабируется › Работают очень эффективно › Нельзя строить сложные сегменты Запрос в одну распределенную таблицу 19
  • 20. Пользователи, получившие рассылку 20 SELECT CountryID AS country, uniq(DeviceID) AS users FROM events_partition WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’)) AND AppPlatform = 'android' AND DeviceID GLOBAL IN ( SELECT DeviceID FROM push_campaigns_partition WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’)) AND CampaignID = 888 ) GROUP BY country metrics dimensions filters e:users e:country os == ‘android’ and exists pc:device with (campaign == ‘BlackFriday’)
  • 21. 1. Запрос отправляется на произвольный хост нужной партиции 2-3. Хост вычисляет внутренний подзапрос в распределенную таблицу 4. Отправляет внешний запрос на все хосты вместе с результатом подзапроса 5-6. Получает частичные агрегаты и соединяет их. Возвращает результат Запрос с GLOBAL IN 21 1 2 3 4 Java backend 5 6
  • 22. › При расширении кластера загружается сеть › Работают менее эффективно › Можно строить сегменты любой сложности Запрос с GLOBAL IN 22
  • 23. Локальность данных по DeviceID 23 SELECT CountryID AS country, uniq(DeviceID) AS users FROM events_partition WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’)) AND AppPlatform = 'android' AND DeviceID IN ( SELECT DeviceID FROM push_campaigns WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’)) AND CampaignID = 888 ) GROUP BY country metrics dimensions filters e:users e:country os == ‘android’ and exists pc:device with (campaign == ‘BlackFriday’)
  • 24. › Замена глобальных IN и JOIN на локальные ускоряет запросы и разгружает сеть › Имеет смысл если почти все наши IN и JOIN происходят по полю DeviceID › Но при этом нужно уметь делать перешардирование Локальность данных по DeviceID 24
  • 25. Что делать если крупное приложение хочет посмотреть сложный отчет за несколько лет? › Движок таблицы MergeTree поддерживает семплирование › Ключ семплирования должен быть равномерно распределен Запросы без семплирования и с семплированием SELECT count() FROM events SELECT count() * 10 FROM events SAMPLE 1/10 Семплирование в отчетах 25
  • 26. SELECT count() * 3 FROM events WHERE DeviceID % 3 = 0 SELECT count() * 3 FROM events SAMPLE 1/3 Семплирование в отчетах 26
  • 27. › Ключ семплирования должен быть одинаковым во всех таблицах › Ключ должен быть привязан к столбцу, по которому делается IN Семплирование в отчетах 27 SELECT count() * 10 FROM events SAMPLE 1/10 WHERE DeviceID IN ( SELECT DeviceID FROM push_campaigns SAMPLE 1/10 )
  • 28. Адаптивное семплирование 28 SELECT uniq(DeviceID) * (42/13) AS users FROM events_partition SAMPLE 13/42 WHERE AppID = 46 AND (Date BETWEEN toDate(‘2017-06-01’) AND toDate(‘2017-06-07’)) accuracy metrics medium e:users
  • 29. › Оценить сколько строк будет обработано запросом › Выставить коэффициент семплирования так, чтобы обработанных строк стало не больше N › Делать это быстро Адаптивное семплирование 29
  • 30. Если запрос не помещается в память SELECT … FROM events GROUP BY DeviceID SELECT … FROM events SAMPLE 1/3 OFFSET 0 GROUP BY DeviceID SELECT … FROM events SAMPLE 1/3 OFFSET 1/3 GROUP BY DeviceID SELECT … FROM events SAMPLE 1/3 OFFSET 2/3 GROUP BY DeviceID Разбиение запроса на части 30
  • 31. › Мы храним данные в ClickHouse и строим отчеты на лету › Мы сделали свой DSL для описания отчетов › Не все отчеты можно выразить через Reporting API › Есть возможность выгрузки сырых логов Заключение 31