Использование 
Hadoop в Badoo 
Валерий Старынин
В докладе будет рассказано: 
• Какую статистику мы собираем 
• Зачем нам потребовалось распределенное хранение и 
обработка статистики 
• Hadoop — это совсем не страшно 
• Как и что мы сделали, что получили, что планируем 
сделать еще
Badoo это: 
• Социальная сеть для поиска новых друзей 
• 226 млн. зарегистрированных пользователей 
• Работаем во всех странах мира 
• Мобильные приложения под Android, iOS, Windows, 
BlackBerry. А так же Wap и HTML5 версии 
• 2,5 дата-центра: в Европе, Америке и Азии 
• Более 3 000 серверов
Событие в статистике — что это такое? 
• Действия пользователей 
• Действия модераторов 
• Действия скриптов 
• Ошибки 
• Отчеты о выполнении
Scribe 
USA Europe
Статистика активности 
Primary key 
ts id vote_yes vote_no time_on_site 
2014-07-01 17476 57 6 730 
2014-07-01 19847 1 0 245 
2014-07-01 21822 4 18 223 
2014-07-01 21999 4 36 269 
2014-07-01 22069 14 18 6428 
2014-07-02 17476 55 49 4067 
2014-07-02 19847 3 0 1967 
2014-07-02 28406 6 7 591 
2014-07-02 30557 8 111 892
Проблемы 
• Ежемесячный объем таблиц до 350 Гб 
• Сложно добавлять колонки 
• Не хватает места на серверах 
• Нет детальной информации 
• Нельзя посчитать COUNT DISTINCT
Хочется: 
• хранить все в неагрегированном виде и долго 
• расширять объем хранилища без проблем 
• максимально упростить добавление колонок 
• обеспечить доступность данных для анализа 
• использовать SQL для обработки данных
Найден вариант - Hadoop 
• очень известный продукт 
• используется крупными компаниями (Yahoo!, Facebook) 
• в команде есть люди с опытом использования 
• на конференциях рассказывают истории успеха 
• должен подойти и нам 
Но! 
Мы чего-то боялись!
Что хорошего в Hadoop'е? 
• это не «черный ящик» 
• данные физически хранятся в виде файлов 
• данные реплицируются 
• есть HiveQL, похожий на синтаксис MySQL 
• можно работать с TSV и JSON
HiveQL 
CREATE EXTERNAL TABLE hadoop_activity_dump ( 
ts int, 
user_id bigint, 
passive_user_id bigint, 
action string, 
val int 
) 
PARTITIONED BY (dt string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY 't' 
LINES TERMINATED BY 'n' 
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 
LOCATION '#DATA_LOCATION#';
HiveQL 
SELECT * FROM hadoop_activity_dump; 
1409443200 247868708 3275040429 m:n 1 2014-08-31 
1409443200 2624466230 2284443029 m:y 1 2014-08-31 
1409443200 1195110158 0 t 11 2014-08-31 
1409443200 1286688141 0 t 21 2014-08-31 
1409443201 4038376852 0 t 45 2014-08-31 
1409443201 466067351 3099962807 m:n 1 2014-08-31 
1409443201 493584063 324505095 m:y 1 2014-08-31 
1409443201 1325438477 0 t 11 2014-08-31 
1409443201 881632551 0 t 32 2014-08-31
Использование в Badoo 
• Activity 
• длительное хранение данных 
• HotPanel 
• ClickStream
Мы перестали бояться 
И начали собирать события активности пользователей: 
ts ; user_id ; passive_user_id ; action; count 
2014-08-31 00:01:00 12345 54321m:n 1 
2014-08-31 00:01:05 23456 0t 45 
2014-08-31 00:01:05 23456 65432m:n 1 
2014-08-31 00:02:03 12345 76543m:y 1 
2014-08-31 00:02:03 12345 0t 50 
2014-08-31 00:05:00 23456 0t 21 
2014-08-31 00:10:00 12345 87654m:n 1
Доставка 
USA Europe 
hadoop 
split 
gzip 
split 
gzip
Построение агрегатов 
2014-08-31 12345m:n 1 
2014-08-31 23456t 45 
2014-08-31 23456m:n 1 
2014-08-31 12345m:y 1 
2014-08-31 12345t 50 
2014-08-31 23456t 21 
2014-08-31 12345m:n 1 
2014-08-31 12345m:n 2 2 
2014-08-31 23456t 66 2 
2014-08-31 23456m:n 1 1 
2014-08-31 12345m:y 2 1 
2014-08-31 12345t 50 1
Построение Activity 
INSERT INTO f_hadoop_activity 
SELECT 
activity_date 
, user_id 
, sum(case when act IN ('m:y') then val_sum else 0 end) as mm_vote_yes 
, sum(case when act IN ('m:n') then val_sum else 0 end) as mm_vote_no 
, sum(case when act IN ('t') then val_sum else 0 end) as time_on_site 
FROM staging_f_hadoop_activity 
GROUP BY activity_date, user_id;
Сбор из StatsCollector'а 
• StatsCollector собирает в MySQL, а хочется — в Hadoop 
• будем периодически перекладывать в Hadoop 
• выгружаем данные как есть, с заголовками колонок 
• при загрузке из Hadoop'а учитывается требуемый 
порядок колонок, отсутствующие заменяются значениями 
по-умолчанию
HotPanel 
• замена Google Analytics 
• собираем события в мобильных приложениях 
• события слабо структурированы — собираем и 
обрабатываем в JSON 
• аналитика по всевозможным параметрам
ClickStream 
На каждый запрос собираем все, что можно: 
• URL, referrer 
• ip, user_agent 
• user_id 
• все события StatsCollector'а 
Это позволяет делать подробнейший анализ любого 
происшествия
Мониторинг 
• состояние серверов 
• количество DataNode и TaskTracker'ов 
• количество under/over-replicated блоков
Backup 
• исходные файлы хранятся еще 2 дня на серверах загрузки 
• делается backup namespace image'а 
• делается backup информации от hadoop fsck, в которой 
есть названия файлов-блоков: 
hadoop fsck / -files -locations -blocks
Планы на будущее 
• Upgrade Hadoop 1.1.2 -> 2.5 
• использовать Spark, Shark 
• найти замену Scribe
Проблемы Hadoop 
• Hadoop выглядит не production-ready 
• от версии к версии меняется почти все 
• долго искали битый диск 
• не замещает битые блоки
И напоследок...
Немного Geek-порно 
Встречайте его!
Силён!
Быстр!
Вынослив!
Наш Hadoop-кластер! 
NameNode: 
• CPU 4 Core (+Hyper-threading) 
• RAM 64Gb 
• HDD 1.1Tb 
15x DataNodes 
• CPU 16 Core (+Hyper-threading) 
• RAM 192Gb 
• HDD 10x1.1Tb 
Ежедневно: 
• 100 Гб данных Activity 
• 1,2 Тб данных ClickStream 
• 270 Гб в сжатом виде, 
810 Гб с учетом репликации 
• 2∙109 событий
Спасибо за внимание! Вопросы? 
http://fb.com/BadooMoscow 
http://vk.com/badoocom 
http://twitter.com/BadooDev 
http://habrahabr.ru/company/badoo

Использование Hadoop в Badoo, Валерий Старынин (Badoo)

  • 1.
    Использование Hadoop вBadoo Валерий Старынин
  • 2.
    В докладе будетрассказано: • Какую статистику мы собираем • Зачем нам потребовалось распределенное хранение и обработка статистики • Hadoop — это совсем не страшно • Как и что мы сделали, что получили, что планируем сделать еще
  • 3.
    Badoo это: •Социальная сеть для поиска новых друзей • 226 млн. зарегистрированных пользователей • Работаем во всех странах мира • Мобильные приложения под Android, iOS, Windows, BlackBerry. А так же Wap и HTML5 версии • 2,5 дата-центра: в Европе, Америке и Азии • Более 3 000 серверов
  • 4.
    Событие в статистике— что это такое? • Действия пользователей • Действия модераторов • Действия скриптов • Ошибки • Отчеты о выполнении
  • 5.
  • 6.
    Статистика активности Primarykey ts id vote_yes vote_no time_on_site 2014-07-01 17476 57 6 730 2014-07-01 19847 1 0 245 2014-07-01 21822 4 18 223 2014-07-01 21999 4 36 269 2014-07-01 22069 14 18 6428 2014-07-02 17476 55 49 4067 2014-07-02 19847 3 0 1967 2014-07-02 28406 6 7 591 2014-07-02 30557 8 111 892
  • 7.
    Проблемы • Ежемесячныйобъем таблиц до 350 Гб • Сложно добавлять колонки • Не хватает места на серверах • Нет детальной информации • Нельзя посчитать COUNT DISTINCT
  • 8.
    Хочется: • хранитьвсе в неагрегированном виде и долго • расширять объем хранилища без проблем • максимально упростить добавление колонок • обеспечить доступность данных для анализа • использовать SQL для обработки данных
  • 9.
    Найден вариант -Hadoop • очень известный продукт • используется крупными компаниями (Yahoo!, Facebook) • в команде есть люди с опытом использования • на конференциях рассказывают истории успеха • должен подойти и нам Но! Мы чего-то боялись!
  • 10.
    Что хорошего вHadoop'е? • это не «черный ящик» • данные физически хранятся в виде файлов • данные реплицируются • есть HiveQL, похожий на синтаксис MySQL • можно работать с TSV и JSON
  • 11.
    HiveQL CREATE EXTERNALTABLE hadoop_activity_dump ( ts int, user_id bigint, passive_user_id bigint, action string, val int ) PARTITIONED BY (dt string) ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' LINES TERMINATED BY 'n' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' LOCATION '#DATA_LOCATION#';
  • 12.
    HiveQL SELECT *FROM hadoop_activity_dump; 1409443200 247868708 3275040429 m:n 1 2014-08-31 1409443200 2624466230 2284443029 m:y 1 2014-08-31 1409443200 1195110158 0 t 11 2014-08-31 1409443200 1286688141 0 t 21 2014-08-31 1409443201 4038376852 0 t 45 2014-08-31 1409443201 466067351 3099962807 m:n 1 2014-08-31 1409443201 493584063 324505095 m:y 1 2014-08-31 1409443201 1325438477 0 t 11 2014-08-31 1409443201 881632551 0 t 32 2014-08-31
  • 13.
    Использование в Badoo • Activity • длительное хранение данных • HotPanel • ClickStream
  • 14.
    Мы перестали бояться И начали собирать события активности пользователей: ts ; user_id ; passive_user_id ; action; count 2014-08-31 00:01:00 12345 54321m:n 1 2014-08-31 00:01:05 23456 0t 45 2014-08-31 00:01:05 23456 65432m:n 1 2014-08-31 00:02:03 12345 76543m:y 1 2014-08-31 00:02:03 12345 0t 50 2014-08-31 00:05:00 23456 0t 21 2014-08-31 00:10:00 12345 87654m:n 1
  • 15.
    Доставка USA Europe hadoop split gzip split gzip
  • 16.
    Построение агрегатов 2014-08-3112345m:n 1 2014-08-31 23456t 45 2014-08-31 23456m:n 1 2014-08-31 12345m:y 1 2014-08-31 12345t 50 2014-08-31 23456t 21 2014-08-31 12345m:n 1 2014-08-31 12345m:n 2 2 2014-08-31 23456t 66 2 2014-08-31 23456m:n 1 1 2014-08-31 12345m:y 2 1 2014-08-31 12345t 50 1
  • 17.
    Построение Activity INSERTINTO f_hadoop_activity SELECT activity_date , user_id , sum(case when act IN ('m:y') then val_sum else 0 end) as mm_vote_yes , sum(case when act IN ('m:n') then val_sum else 0 end) as mm_vote_no , sum(case when act IN ('t') then val_sum else 0 end) as time_on_site FROM staging_f_hadoop_activity GROUP BY activity_date, user_id;
  • 18.
    Сбор из StatsCollector'а • StatsCollector собирает в MySQL, а хочется — в Hadoop • будем периодически перекладывать в Hadoop • выгружаем данные как есть, с заголовками колонок • при загрузке из Hadoop'а учитывается требуемый порядок колонок, отсутствующие заменяются значениями по-умолчанию
  • 19.
    HotPanel • заменаGoogle Analytics • собираем события в мобильных приложениях • события слабо структурированы — собираем и обрабатываем в JSON • аналитика по всевозможным параметрам
  • 21.
    ClickStream На каждыйзапрос собираем все, что можно: • URL, referrer • ip, user_agent • user_id • все события StatsCollector'а Это позволяет делать подробнейший анализ любого происшествия
  • 22.
    Мониторинг • состояниесерверов • количество DataNode и TaskTracker'ов • количество under/over-replicated блоков
  • 23.
    Backup • исходныефайлы хранятся еще 2 дня на серверах загрузки • делается backup namespace image'а • делается backup информации от hadoop fsck, в которой есть названия файлов-блоков: hadoop fsck / -files -locations -blocks
  • 24.
    Планы на будущее • Upgrade Hadoop 1.1.2 -> 2.5 • использовать Spark, Shark • найти замену Scribe
  • 25.
    Проблемы Hadoop •Hadoop выглядит не production-ready • от версии к версии меняется почти все • долго искали битый диск • не замещает битые блоки
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
    Наш Hadoop-кластер! NameNode: • CPU 4 Core (+Hyper-threading) • RAM 64Gb • HDD 1.1Tb 15x DataNodes • CPU 16 Core (+Hyper-threading) • RAM 192Gb • HDD 10x1.1Tb Ежедневно: • 100 Гб данных Activity • 1,2 Тб данных ClickStream • 270 Гб в сжатом виде, 810 Гб с учетом репликации • 2∙109 событий
  • 32.
    Спасибо за внимание!Вопросы? http://fb.com/BadooMoscow http://vk.com/badoocom http://twitter.com/BadooDev http://habrahabr.ru/company/badoo