О чем статья?

В статье Архитектура высоконагруженной платформы Magnit F&R было рассказано о ключевых архитектурных принципах и решениях.

Сегодня хочу поделиться практическим опытом: как в Magnit Tech изменилась концепция Data Lakehouse, где она блестяще сработала — и где подвела.

Я, Алексей Соболеков, лид архитектуры F&R.

И это история о том, как красивая теория сталкивается с физикой доступа к данным.

Классические F&R системы

Большинство современных систем класса Forecast and Replenishment (F&R), использующих машинное обучение (Machine Learning), состоят из стандартных подсистем:

  • Интеграция: стандартные ELT-процессы для загрузки, очистки и структурирования данных из внешних систем.

  • Прогнозирование: расчёты с применением Data Science и ML для формирования прогнозов спроса.

  • Пополнение: ETL/ELT-конвейер, где данные и параметры трансформируются в рекомендации к заказу по сложной бизнес-логике.

  • UI: BI-подсистемы для просмотра, анализа и корректировки многомерных данных.

У большинства вендоров каждая подсистема имеет свою базу данных и общается с остальными через API. Такую архитектуру можно назвать «классической». Она проверена временем, но не масштабом.

Классическая архитектура решений класса F&R
Классическая архитектура решений класса F&R

Для «Магнита» такая архитектура не подошла из-за низкой производительности. Масштаб задачи иллюстрируют требования к пропускной способности.

 

Требования к мощности Magnit F&R

Пропускная способность Magnit F&R. На стрелочках указаны суточные объемы, в функциональных блоках - длительность, в блоках данных - объем хранилища
Пропускная способность Magnit F&R. На стрелочках указаны суточные объемы, в функциональных блоках - длительность, в блоках данных - объем хранилища

Каждую ночь система рассчитывает 180 миллиона связок «Товар–Локация–День».

  • Ежедневный прирост исходных данных — 1 ТБ

  • Система генерирует до 30 ТБ расчётных данных

  • Общий объём хранилища — 10 ПБ

Инфраструктура должна обеспечивать пропускную способность порядка 30 ГБ/с, чтобы уложиться в 7-часовое ночное окно для перерасчётов.

«Коробочные» F&R-решения с классической архитектурой и выделенными БД такой производительности обеспечить не могут. 

Почему Data Lakehouse?

Нам была критически важна минимизация избыточности и дублирования данных между модулями. Наше хранилище должно было быть:

  • Единым для больших данных прогнозирования и транзакционных данных пополнения.

  • Масштабируемым для обеспечения производительности.

  • Экономически эффективным в облачной инфраструктуре.

Взглянем на классическую схему эволюции хранилищ данных

Концепции хранилищ данных
Концепции хранилищ данных

Концепция Data Lakehouse объединяет гибкость Data Lake и управляемость Data Warehouse, что казалось идеальным решением наших задач.

Был проведен тщательный анализ технологий, соответствующих концепции Data Lakehouse по ключевым критериям:

  • полностью развернуто в облачной инфраструктуре,

  • базируется только на Open Source технологиях (нет привязки ни к одному из производителей),

  • масштабируется горизонтально,

  • поддерживает ANSI SQL и ACID,

  • поддержка версионности данных,

  • эффективно обрабатывает данные и в пакетном, и в интерактивном режимах.

В результате остановились на стеке: S3 + Apache Iceberg + Trino + PostgreSQL.

Архитектура данных F&R в концепции Data Lakehouse
Архитектура данных F&R в концепции Data Lakehouse

Теоретически всё выглядело безупречно:

  • S3 + Parquet: масштабируемость и низкая стоимость хранения.

  • Apache Iceberg: ACID, версионирование и упрощённое управление большими таблицами.

  • Trino — единый SQL-движок, который позволяет UI обращаться напрямую ко всем данным.

  • PostgreSQL — для параметров и небольших CRUD-операций.

Ожидалось, что этого хватит, чтобы обойтись без выделенной БД для витрин UI и даст возможность строить аналитические отчёты и пользовательские интерфейсы непосредственно на данных в Lakehouse.

Меньше ETL — меньше сложностей, дублирования, выше производительность и ниже стоимость. Всё казалось логичным и технологически элегантным. Но, как это часто бывает, реальность внесла свои коррективы.

Что пошло не так?

Первые тесты были многообещающими. Trino стабильно работал с Iceberg, SQL-запросы выполнялись и горизонтально масштабировались. Немного смущал неидеальный отклик, но планировалось оптимизировать его позже с помощью витрин и кеширования через Alluxio.

Проблемы начались с приходом реальных пользователей. Интерактивный интерфейс требовал мгновенного отклика — десятки коротких запросов к одной таблице, фильтрация, графика, сортировки, корректировки.

И здесь Trino показал свою обратную сторону. Среднее время отклика для пользовательских запросов выросло с 2–3 до 20–30 секунд, а иногда и больше.

Кол-во пользователей

20

40

60

120

150

Время отклика Trino

2,5 сек.

9.5 сек.

9.9 сек.

21.4 сек.

27.4 сек.

Причина крылась в самой природе Lakehouse:

  • В Iceberg нет индексов. Обращение к большим таблицам (500 млн. строк) занимало секунды.

  • Trino при каждом запросе обращается к метаданным Iceberg и в S3. Задержки в миллисекунды накапливались и превращались в секунды.

  • Кэширование результатов не спасало при высоком разнообразии запросов.

Для пакетных расчётов в модулях Прогноза и Пополнения — это терпимо. Для конечных пользователей, работающих с UI — фатально. Наши нефункциональные требования предписывали среднее время отклика UI не более 1 секунды. Архитектура Lakehouse не могла уложиться даже в 3 секунды.

Как решили проблему?

Провели R&D с целью подобрать технологию, способную выдержать высокий уровень параллельных пользовательских запросов и обеспечить мгновенный отклик интерфейса.

В качестве кандидата для сравнения выбрали ClickHouse — по следующим критериям:

  • горизонтальное масштабирование и высокая устойчивость под нагрузкой;

  • выдающаяся скорость выборки и агрегации данных;

  • подтверждённый опыт промышленного использования в системах с сотнями одновременных пользователей.

Цель нагрузочного тестирования — смоделировать реальную работу UI, где десятки пользователей одновременно выполняют SQL-запросы к витрине плана пополнения, объемом 500 млн. строк, со случайными параметрами фильтрации и джойнами справочников.

Время отклика Trino vs ClickHouse
Время отклика Trino vs ClickHouse

Результаты говорят сами за себя:

  • Trino при 60–120 пользователях показывал задержку >10 секунд, а при 150 — >25 секунд. Кэширование через Alluxio ускоряло повторные идентичные запросы до 1 секунды, но не помогало при уникальных.

  • ClickHouse удерживал время отклика менее 0.05 секунды вплоть до сотен пользователей и начинал замедляться лишь при тысячах.

Разница — на три порядка. Для интерактивного интерфейса — это разница между «работает» и «не работает».

Добавили в архитектуру слой витрин UI на ClickHouse и разработали ETL на Spark для их предрасчёта. Так система эволюционировала от чистого Lakehouse к гибридной модели Data Lake + OLAP.

Что изменилось после добавления ClickHouse

 

Архитектура данных F&R в гибридной модели Data Lake + OLAP
Архитектура данных F&R в гибридной модели Data Lake + OLAP

UI стал моментально отзывчивым. Время отображения страниц сократилось с десятков секунд до долей секунды. Пользователи сразу ощутили разницу.

Trino остался «источником истины» и основным источником данных для расчётов, а ClickHouse взял на себя оперативную аналитику и быстрые выборки.

Выводы

Эта история не о том, что связка S3/Iceberg/Trino плоха, а ClickHouse хорош. Она о том, что любой инструмент нужно выбирать под конкретную задачу, а не под тренд.

Data Lakehouse — хорошо подходит для:

  • Консолидации и хранения огромных объёмов данных.

  • Сквозных ML-пайплайнов.

  • Пакетной обработки и ETL.

Но он не предназначен для сценариев, где требуется:

  • Скорость реакции интерфейса в миллисекундах.

  • Множество коротких запросов с произвольной фильтрацией к большим таблицам.

Внедрение ClickHouse потребовало не только технических, но и организационных изменений. Мы расширили использование паттерна CQRS, выделив отдельный слой для быстрых пользовательских запросов, и добавили дополнительный ETL-процесс для подготовки данных. Потоки пришлось переработать: ClickHouse отлично справляется с аналитическими выборками, но не любит сложные JOIN-ы на лету.

Зато мы перестали бороться с физикой доступа к данным в S3 и фактически объединили лучшее из двух миров — надёжное хранилище Lakehouse и молниеносные витрины ClickHouse.

Сегодня в Magnit F&R связка S3/Iceberg/Trino остаётся основой для хранения и пакетной обработки, а ClickHouse — для интерактивных пользовательских сценариев.

Остались вопросы к нашему стеку с точки зрения транзакционной целостности на больших объёмах, и справится ли с этим PostgreSQL. Но это уже совсем другая история.

Комментарии (1)


  1. ilya-panov
    14.11.2025 20:22

    Расскажите, пожалуйста, как у вас ClickHouse работает с данными. Он через S3Engine ходит в лейкхаус или отдельным ETL грузите в него нужные витрины? И ещё интересно про сам ClickHouse:
    - он у вас в виде кластера?
    - на сколько сопоставимы кластера клика и трино?