Кейс Airbnb: как ускорить аналитику с помощью Druid

12 минут

За десять лет Airbnb стала крупнейшей в мире онлайн-площадкой для краткосрочной аренды жилья. К началу 2019 года здесь нашли апартаменты 400 миллионов клиентов. Сервис обрабатывает запросы из 191 страны: миллионы пользователей ищут и бронируют жилье, обмениваются сообщениями, оплачивают аренду. Эти действия генерируют огромное количество анонимных данных, которые Airbnb использует, чтобы улучшить работу платформы.

Для анализа такого потока запросов в компании внедрили базу данных Druid. У древних кельтских народов друидами называли жрецов, которые проводили секретные ритуалы. То, что делает Airbnb с помощью Druid, тоже немного похоже на магию.

Статья подготовлена на основе перевода материала «How Druid enables analytics at Airbnb» с дополнениями.

Что такое Druid

Druid — распределенная база данных с открытым исходным кодом на Java. Хранилище мгновенно принимает потоковые данные, быстро обрабатывает большие массивы информации и предоставляет доступ к данным в течение секунды.

Преимущества Druid:

Архитектура Druid представляет собой кластер узлов, выполняющих разные задачи: обработка архивных данных отделена от обработки данных в режиме реального времени, ответы на запросы от управления кластером.

Типы узлов в Druid:

  • исторические — обрабатывают исторические данные;
  • координаторы — контролируют работу исторических узлов с данными;
  • брокерские — получают запросы и отправляют их другим узлам, затем возвращают ответы;
  • узлы реального времени и индексирования (middle manager) — обрабатывают данные в режиме реального времени;
  • управляющие узлы — управляют задачами.

Данные Druid хранятся в хранилище, разделенном по времени и другим атрибутам. Каждый временной диапазон называют блоком, например, в одном блоке могут быть данные за день или за час. Такой блок разделен на сегменты — файлы, содержащие данные.

Druid можно развертывать inhouse либо получить в виде облачного сервиса.

Как в Airbnb «доросли» до Druid

Airbnb — место встречи миллионов гостей и хозяев жилья, их данные собирают без привязки к пользователям и анализируют. Команда, которая занимается обработкой данных, работает над тем, чтобы быстрее получать необходимую аналитику и принимать решения.

В Airbnb использовали различные панели мониторинга, помогающие в реальном времени отслеживать параметры, важные для бизнеса. И здесь компания столкнулась с тремя проблемами.

Много времени уходило на сбор данных в хранилище и их обработку для панелей мониторинга. Для этого использовали системы Hive и Presto — они считывают данные и агрегируют (объединяют) их по требованию, необходимые вычисления запускаются во время запроса. Hive и Presto не оптимизированы для многократного разделения данных под аналитические запросы, поэтому возникали задержки во времени.

Система аналитики не соответствовала требованиям к надежности и масштабируемости. Airbnb использует аналитические данные для решения многих задач, важна высокая отказоустойчивость системы, ведь даже кратковременный простой негативно отразится на работе платформы. Кроме этого, объем данных, запросов и пользователей продолжает расти, поэтому нужна система, которая сможет справиться с растущим спросом.

Система должна интегрироваться с уже работающей инфраструктурой, основанной на средах с открытым кодом. В Airbnb для хранения и обработки данных используют Hadoop, Kafka и Spark Streaming, новая система должна сочетаться с ними.

Очевидно, Airbnb нужна была альтернатива. Так в компании появился Druid.

Что покорило разработчиков Airbnb в Druid

Быстрая обработка потоковых запросов. В Druid запросы обрабатываются за доли секунды. Панели мониторинга работают заметно быстрее, чем на других системах, в том числе быстрее, чем на Hive и Presto.

Надежная и масштабируемая архитектура. Узловая архитектура Druid надежна, стабильно выдерживает рабочие нагрузки, легко масштабируется при необходимости.

В Druid архивные данные хранятся в глубоком хранилище и временно кэшируются историческими узлами на локальном диске, данные реального времени обрабатываются отдельно, что ускоряет получение ответа на запросы.

Хранение аналитических данных в хранилище S3 позволяет бесплатно восстанавливать их после аварий, а также легко управлять обслуживанием и обновлением оборудования кластера Druid, например, легко переключать типы узлов.

Интеграция со средами с открытым исходным кодом. Инфраструктура данных Airbnb в основном основана на Kafka и Hadoop, и Druid плавно интегрируется с ней.

Например, API Druid позволяет получать данные из Hadoop для пакетной аналитики. Потоковая передача данных в Druid для аналитики в реальном времени осуществляется с помощью Tranquility, которое включает в себя API Java и Scala, может интегрироваться со Spark, Samza и любым другим потоковым механизмом на JVM.

В Airbnb потоковая передача данных в Druid реализована с помощью клиента Tranquility и Spark Streaming. Кроме этого, Druid можно интегрировать с Apache Superset — системой визуализации данных, разработанной в Airbnb. Superset служит пользовательским интерфейсом для составления и выполнения аналитических запросов к Druid и визуализации результатов.

Помимо Airbnb, технологии Druid используют и другие известные компании: Alibaba, eBay, Yahoo!, Netflix, Wikimedia.

Как Airbnb использует Druid: конфигурация с двумя кластерами

В Airbnb используют два кластера Druid, которые обслуживают разные задачи.

Всего в систему входит четыре брокерских узла, два управляющих узла, два узла-координатора, восемь узлов реального времени и индексирования (middle manager) и 40 исторических узлов. Кроме этого, кластеры поддерживаются одним MySQL-сервером и одним кластером ZooKeeper с пятью нодами. Кластеры Druid относительно невелики и дешевы по сравнению с другими сервисными кластерами, такими как HDFS и Presto.

Один кластер обслуживает критические метрики. Метрики для обслуживания всех информационных панелей легко определить с помощью простых файлов YAML. Также пользователи могут просматривать панели мониторинга и метрики на Superset, ничего не зная о Druid. Пакетные задания планируются с помощью Airflow, куда входят данные из кластера Hadoop.

Все источники данных в реальном времени и другие данные для пользователей обрабатывает второй кластер. Данные поступают через связку Spark Streaming и Tranquility.

Как запросы проходят через архитектуру хранения в Airbnb

Архитектура системы обработки запросов в Airbnb

Как в Airbnb улучшили использование Druid

В Druid множество полезных фич под разные потребности. Но в Airbnb пошли дальше и реализовали специальные функции внутри и на основе Druid, чтобы решать задачи компании.

Платформа для мгновенного ответа на специальные аналитические запросы

В компании много экспертов, которые решают специфические задачи и нуждаются в различных данных о бизнесе. Это требует произвольных способов агрегирования данных, и в Airbnb создали систему самообслуживания на базе Druid.

Она позволяет сотрудникам подразделений компании определять, как данные, создаваемые их приложением или службой, должны быть объединены и представлены в качестве источника данных Druid. Исследователи и аналитики данных могут потом запросить их, чтобы найти ответы на свои вопросы.

Druid агрегирует данные всего за пять минут, еще около минуты задержки приходится на передачу. Благодаря потоковому стримингу от Druid, Airbnb может предоставить пользователям несколько сложных функций, например, обнаружение аномалий.

Интеграция с Presto

У Druid есть механизм запросов с JSON через HTTP RESTful API, в дополнение к поддержке запросов SQL в последних версиях. Однако одно из ограничений Druid в том, что он не допускает перекрестных запросов к источникам данных. Все сводные запросы ограничены одним источником данных.

При этом в Airbnb есть сценарии, когда для определенных запросов нужно объединить несколько пересекающихся источников данных. Конечно, можно хранить все данные в одном источнике, но это не подходит для компании по ряду причин, в том числе частоты генерации данных и разных источников данных, например, данные создают разные сервисы.

Потребность в перекрестных запросах к источникам данных высока. Чтобы ее удовлетворить, в Airbnb разработали собственное решение, основанное на Presto. В частности, предоставили коннектор Presto, который может передавать запросы в Druid по отдельным источникам данных, а также извлекать и объединять данные для выполнения перекрестных запросов к источникам данных.

Улучшение обратной загрузки данных

Запросы в Druid выполняются быстрее, чем в других системах, потому что за их прием взимается дополнительная плата. Каждый сегмент данных должен быть загружен из задания Hadoop MapReduce, прежде чем он станет доступным для запросов. Это хорошо работает при схеме «один раз записали – много раз прочитали», и когда фреймворк принимает новые данные только ежедневно.

Проблемы возникают, когда нужно изменить структуру источника данных и восстановить архивные данные. Это значит, что данные за последние годы должны быть снова залиты в Druid, чтобы заменить старые. Для этого нужно задание на загрузку с долго выполняющейся задачей MapReduce, что уже обходится дорого, особенно, если в середине повторного приема данных произойдет ошибка.

Одно из возможных решений — разделение большой задачи на несколько запросов. Но тогда результаты запроса получатся противоречивыми, так как будут рассчитаны на основе комбинации старых и вновь загруженных данных. Задания обратной загрузки исторических данных выполняются часто, так как меняются требования пользователей и функциональные возможности инфраструктуры. В результате встает проблема повышения производительности такой загрузки.

Чтобы решить эту проблему, в Airbnb разработали решение, которое сохраняет новые сегменты данных неактивными до явного обращения к ним. Это позволяет структуре приема данных разбивать источник данных на интервалы с приемлемыми размерами. Затем инфраструктура принимает их параллельно, насколько это позволяют ресурсы кластера Yarn. Так как вновь загруженные данные в этот момент еще не активны, сегменты в фоновом режиме скрыты, то при вычислении результатов для запросов, отправляемых во время загрузки, разные версии данных не сочетаются. Обновление последней версии сегментов для источника данных происходит сразу после активации.

Такое решение повысило производительность обратной загрузки данных, позволило ее ускорить.

Непрерывный мониторинг

Druid отказоустойчив, небольшие сбои в его работе незаметны пользователям. Даже если сбои затронут узлы, которые являются единой точкой отказа, например, координирующие, управляющие или ZooKeeper, кластер Druid по-прежнему сможет обслуживать запросы. Однако в Airbnb делают все для оперативного обнаружения и устранения всех сбоев, иногда даже до их возникновения, чтобы соблюдать SLA (соглашение об уровне услуг) с пользователями.

Системы мониторинга, настроенные для кластера Druid, отслеживают текущее состояние, собирают статистику и выдают предупреждение, если емкость достигнет критической отметки или обнаружатся сбои в работе.

Чтобы отслеживать общую доступность кластера, в Airbnb каждые 30 минут вводят в Druid один фрагмент данных и каждые пять минут проверяют, совпадает ли результат запроса с каждого брокерского узла с последними загруженными данными.

Архитектура Druid позволяет подстроить систему под задачи компании. На основе показателей мониторинга администраторы кластера легко меняют его конфигурацию, удаляют и добавляют новые узлы. Можно обслуживать большие объемы данных и менять параметры системы с учетом их роста. Если растет рабочая нагрузка в режиме реального времени, добавляют узлы реального времени и индексирования, а когда понадобится больше возможностей для обработки запросов, увеличивают количество брокерских узлов. Благодаря такой архитектуре Druid, в Airnbnb смогли перенести все данные хранилища из HDFS в S3 всего за несколько минут.

Проблемы, которые возникают с Druid

Количество пользователей и данных в Airbnb увеличиваются, а вслед за ними меняются требования к Druid.

Одна из проблем — увеличение числа файлов сегментов данных, которые создаются ежедневно и должны быть загружены в кластер. Сегментные файлы — основная единица хранения данных в Druid, в них содержатся предварительно агрегированные данные за определенный промежуток времени.

В Airbnb сталкиваются со сценариями, когда большое количество источников данных нужно пересчитать полностью, при этом надо сразу загрузить в кластер большое количество сегментов. Сейчас сегменты загружаются последовательно в одном потоке, но чем больше их становится, тем сложнее выполнить загрузку. Из-за этого возникает временная задержка между выполнением задания загрузки и моментом, когда данные станут доступны для запроса.

Так выглядит внутренняя структура сегмента в Druid

Структура сегментов Druid. Источник

Обычно эти проблемы решают так: увеличивают размеры целевых сегментов, чтобы уменьшить их количество. Однако в Airbnb объем входных данных слишком велик, такое задание будет выполняться слишком долго. Сейчас в компании ищут альтернативные решения и конфигурации для решения этой проблемы.

Druid в Airbnb: решение для быстрой аналитики

Druid — механизм анализа больших данных, удобный в обслуживании и производительный. Его хорошо продуманная архитектура позволяет легко управлять кластером и масштабировать его, а оптимизированный формат хранения дает возможность быстро обрабатывать аналитические запросы. В Airbnb успешно развернули Druid и видят новые возможности его использования по мере роста базы пользователей.

Иллюстрация в шапке: https://www.mercadoeconsumo.com.br/2017/10/10/varejo-total-destino-varejo-2020-parte-ii-pessoas/

Group 40Group 44Group 43Group 46Group 41Group 27Group 42Group 39