Всем привет! Я Слава Жуков, CDO в eCommerce-агентстве Aero. Сегодня расскажу, как мы сделали облачное хранилище понятным и структурированным источником информации для Hoff.
Предыстория
В октябре 2021 года Hoff обратились за корректировкой разметки web-аналитики, но после нескольких консультаций стало ясно, что истинный запрос гораздо шире — в области работы с большими данными.
В компании существует два хранилища, на основе которых работает глобальная аналитическая система Hoff:
Внутреннее, в котором лежат ключевые данные ритейлера (продажи по товарам, регионам и др)
Облачное DWH, которое использовалось для работы продуктовых и маркетинговых аналитиков
За 5 лет в облаке накопился внушительный пул данных об онлайн-заказах и поведении пользователей, а также легаси-код, который замедлял выполнение новых аналитических задач. Структура хранилища DWH на базе Google Cloud Platform влекла за собой недочеты, которые ставили под вопрос качество собираемой информации. Сырые данные из более чем 10 источников стекались в BigQuery, использовались для 155 дашбордов и занимали 1938 расчетных полей в 42 отчетах. Иногда данные могли противоречить друг другу, что усложняло принятие решений для бизнеса.
Такая система позволяла закрывать текущие задачи компании, но для развития и реализации амбиций требовался переход на качественно новый уровень работы с данными. Так, целью стал рефакторинг облачного хранилища.
Основной задачей было привести онлайн-данные в порядок: создать единые принципы хранения, разработать масштабируемую архитектуру, выстроить правильную систему алертинга для регулярного контроля качества. В общем, сделать облачное хранилище понятным и структурированным источником информации для Hoff.
Дискавери-фаза
Начали с анализа старой структуры: требовалось понять и описать картину as is, поэтому мы провели реверсивный инжиниринг. Начиная с конца, то есть от дашбордов, по цепочке «шли» к сырым данным в источниках, попутно выявляя все последовательности и правила преобразования.
Это был один из самых сложных этапов, потому что потоки данных в облаке на старте проекта выглядели следующим образом:
Было обнаружено, что:
Из 93 ТБ данных в BigQuery почти треть — ненужные или устаревшие.
Объем еженедельных запросов к хранилищу из PowerBI составляет 29 ТБ.
Обработка запросов данных стоит компании порядка 3000$ в месяц.
В общем, всё работало долго, дорого и сложно. Стало ясно, что нужно не только оптимизировать облачное хранилище, но и выстроить универсальный регламентированный процесс сбора, очистки и обработки данных для масштабирования аналитики.
Спасение данных и переезд
Сразу после аудита мы предложили перейти из BigQuery на open-source решения в Yandex Cloud, так как на текущем этапе развития платить за каждое обращение к данным было нерационально. Это казалось рискованным предложением на фоне привычных сервисов Google, но в феврале картина мира резко изменилась — риск отключения стал стимулом к локализации хранилища.
Как без паники выгрузить 93 ТБ данных ASAP, пока Google рассылает «письма счастья»? В этом помог аудит. С коллегами из Hoff оперативно решили, какие данные можем не забирать, прописали скрипты для разных сценариев выгрузки в s3 и подняли 3 виртуальные машины для синхронизации хранилища.
Благодаря проактивности всех участников процесса и помощи аналитиков из Hoff, уже спустя месяц у нас был доступ к историческим данным на случай отключения инфраструктуры Google.
Новое хранилище на базе open-source
Мы выбрали Clickhouse и Greenplum — это бесплатные сервисы с открытым исходным кодом, над которыми работает большое количество разработчиков. Из-за этого они, как правило, содержат меньше дефектов, быстрее обновляются и в целом обеспечивают гибкий рабочий процесс. При желании, текущую архитектуру Hoff можно быстро перенести из облака на локальные сервера без потери данных, в то время как BigQuery заставляет буквально с нуля пересобирать все хранилище.
В то же время open-source — это про стабильность. Блокировка сервисов поставила под сомнение существование экосистемы данных множества компаний, а открытые решения снимают подобные риски.
Разработка архитектуры
Clickhouse хорошо работает с сырыми данными: за счет высокого сжатия хранилище занимает меньше места, но при этом даже единичные ad hoc запросы выполняются оперативно. Для ядра DWH выбрали Greenplum. Благодаря распределенной обработке, в нем можно быстро джойнить, изменять и фильтровать данные. В BigQuery аналитики Hoff работали только с raw data level, то есть с сырыми данными, которые мы перенесли в Clickhouse вместе с коннекторами. Предобработанные данные упорядочили в Greenplum в виде Data Vault 2.0.
Это гибридная модель, суть которой — дробление массива данных на логические сегменты. В таком формате удобнее работать с хранилищем: все сотрудники от менеджеров до аналитиков могут компилировать информацию в зависимости от своих потребностей.
В Data Vault переносятся только обработанные с помощью фреймворка DBT данные. Такой подход позволяет доверять информации в хранилище на 100%, не переживая об актуальности и достоверности. С помощью пайплайнов в Airflow мы настроили автоматическое обновление по заданному расписанию.
Благодаря выстроенным процессам и описанным регламентам сотрудники Hoff могут поддерживать эту систему самостоятельно.
Алертинг
Надежность хранилища определяется качеством системы оповещений, то есть алертингом. Когда пользователь обращается к данным, он должен понимать их текущее состояние: корректность выгрузки, точность расчетов, последнюю дату обновления. Именно в нашей зоне ответственности сказать бизнесу, если что-то идет не так, предупредить возможные ошибки и принятие неверных решений.
Для новой архитектуры мы с нуля создали полноценную систему оповещений. Теперь при обнаружении ошибки уведомления будут появляться на всех этапах работы с ними — от загрузки сырых данных до дашбордов.
Витрины данных
Еще один важный этап работы — создание аналитических витрин или data mart. Это части хранилища в виде агрегированных таблиц, которые содержат данные по разным направлениям деятельности компании. Как правило, это ключевые метрики, которые можно комбинировать различными способами для дальнейшего анализа.
На основе витрин данных строится визуализация: один data mart может быть источником для 600 дашбордов. Ранее они делались из сырых данных, которые перед формированием отчета обрабатывал тот или иной отдел на основе своей экспертизы, а теперь — из предобработанной по единому стандарту информации.
Что в итоге
За год удалось с нуля пересобрать хранилище на облачной платформе и оптимизировать все данные: из 93 ТБ в ядро уложили 51 ТБ регулярно используемой информации. Сейчас ежедневный прирост сырых данных — около 15 ГБ, а в Data Vault — 3 ГБ единообразно обработанных.
За счет алгоритмов и разделения хранилища на слои, аналитики обращаются только к необходимому, подготовленному для работы объему информации. У специалистов стало уходить меньше времени на рутинные отчеты, что открыло возможности для новых проектов по развитию компании.
Комментарии (13)
EvgenyVilkov
00.00.0000 00:00Каждый раз удивляюсь когда green plum называют быстрым.
zhukov_slava Автор
00.00.0000 00:00Если мы говорим про джойны в ядре хранилища, которых очень много в рамках данного проекта, то Greenplum значительно быстрее, чем тот же ClickHouse. И в целом в рамках opensource MPP-систем выбор не особо велик, а зарубежные вендоры под понятными рисками
EvgenyVilkov
00.00.0000 00:00+1CH и GP несравнимые в этом плане системы тк на CH у вас в принципе не особо хорошо JOIN получится сделать как таковой. GP работает на fullscan операциях и это уже на старте не делает его чемпионом.
У вас есть S3. Добавьте metastore к нему и дальше любой SQL движок (напр Impala, Presto\Trino) который умеет читать и писать S3). И это будет гораздо эффективнее с тч cost per performance в облаке чем GP да и еще гибче на порядок.
zhukov_slava Автор
00.00.0000 00:00Спасибо за вариант)
Потестим, насколько хорошо будет работать и насколько в такой парадигме удобно использовать это для организации DDS-слоя. Просто у нас одним из входящих требований были стабильные затраты на инфраструктуру, а в рамках использования S3 это платная опция, зависящая от числа операций.
influte
00.00.0000 00:00А можно чуть подробнее про алертинг? Как вы бизнесу сообщаете о проблемах и что отчетами можно пользоваться? На сами даши выводите предупреждения или алерты в тг, слак?
zhukov_slava Автор
00.00.0000 00:00Да, есть слак и тг-канал, куда прилетают алерты о проблемах. Касаемо визуализации: делаем через мета-таблицы, в которых содержится информация о проблемах или об их отсутствии)
SLASH_CyberPunk
Поясните, каким образом у вас "КХ хорошо работает с сырыми данными", если эти данные находятся в s3, а оптимизатор в КХ оставляет желать лучшего (даже в версии 22.8)?
zhukov_slava Автор
Данные в S3, которые необходимо было быстро перенести из BigQuery, лежат в паркетах по структуре данных так, как они хранились в Google. В нашей архитектуре ClickHouse их напрямую не читает, они были перенесены из S3 в ClickHouse с помощью отдельного алгоритма на Python. Естественно, была произведена адаптация структуры данных по CH, а новые данные — поступают уже в рамках этой структуры)
По текущим задачам ClickHouse обращается в S3 только при чтении вытесненных данных по TTL (https://cloud.yandex.ru/docs/managed-clickhouse/tutorials/hybrid-storage). Каких-то проблем с этим механизмом не испытываем, всё довольно шустро, но прям тесты не проводили.
SLASH_CyberPunk
Тогда как вы достигаете консистентности сырых данных при загрузке в КХ? Ведь КХ не гарантирует этого...
zhukov_slava Автор
После записи данных происходят проверки мета-информации: кол-во строк полученных из источника должно совпадать с кол-вом строк записанных в CH. Если происходят какие-то обрывы соединений, то ETL-процедура перезапускается. Мы пользуемся дедупликацией, поведением движка Replication Merge Tree по-умолчанию
SLASH_CyberPunk
Ответ 200 OK не гарантирует от КХ получения этих данных после. Как и сколько вы выжидаете, что все данные доехали? Или же вы не сталкивались в этой проблемой?
zhukov_slava Автор
Мы используем clickhouse_driver, нативный TCP-интерфейс. В рамках него ни разу не ловили ситуацию, чтобы часть данных не загрузилась — он висит на выполнении пока не закончится запись. Через 15 секунд, после завершения записи, запускается таска проверки.
Вообще мы ее запускаем, чтобы проверить, что данные отреплицировались на другие хосты. Если в течение нескольких минут по ретраям таска не получает успешного статуса, она падает с ошибкой — и это уже алерт. Такое было несколько раз из-за забития очереди репликации в CH.
SLASH_CyberPunk
Понятно, спасибо.