Koveh Studio Blog

Airflow в 2026? На каком движке построить DWH

Опыт Koveh Studio для продавцов на маркетплейсах

Airflow в 2026? На каком движке построить DWH
![airflow_article2.png](https://koveh.ru/media/blog-images/1766364546776-8fd6b8b4.webp) Эта статья для владельцев бизнеса, директоров e-commerce и техдиров, которые торгуют на маркетплейсах и думают о своём хранилище данных. Мы работаем с компаниями, у которых суммарный оборот по маркетплейсам от 100 млн ₽ в год. Ниже этой планки, честно сказать, полноценный DWH редко окупается. Выше — уже больно жить в Excel, выгрузках из кабинета и «сводной табличке, которую делает Вася». В этой статье объясню, что происходит внутри ETL-движка, зачем вообще нужен Airflow, чем он отличается от простого cron и почему дата-инженер не должен сидеть у вас в штате фулл-тайм годами. ## 1. Зачем вообще нужен отдельный движок для ETL Чтобы хранилище данных работало, нужно каждый день делать три простые вещи: 1. **Забрать данные** из источников: Ozon, Wildberries, Яндекс.Маркет, реклама, внутренняя бухгалтерия/ERP. 2. **Привести их в порядок**: почистить, разложить по таблицам, связать между собой. 3. **Сложить в DWH** — в то место, где аналитик или отчёт BI найдёт всё за секунды. Вот этот конвейер и есть ETL-движок. Даже если сегодня вы «просто выгружаете CSV и загружаете в Excel», у вас уже есть ETL — просто он живёт в головах и руках сотрудников. Проблема в том, что: * люди устают, ошибаются и уходят, * правила маркетплейсов меняются, * API ломаются, * а данные вам нужны каждый день и ночью. Поэтому в какой-то момент бизнес дорастает до автоматического движка. Вопрос не «нужен он или нет». Вопрос «какой» и «чтобы потом не было больно». ## 2. Почему «systemd + cron» — это тупик, а не решение Мы тоже когда-то начали с минимализма. Скрипты на Python, systemd-таймеры, немного логов в файлы — и поехали. На старте это красиво: * ничего лишнего, * нет лишних зависимостей, * админ понимает, что где запускается. Но через несколько месяцев у вас уже не три скрипта, а **сотни задач**: * вы тянете цены, * остатки по FBO и FBS, * транзакции и операции, * рекламные расходы, * ставки и карточки, * отзывы, претензии и жалобы. Каждый источник — со своей периодичностью и своим характером ошибок. И вот здесь начинаются проблемы. ### Что начинает болеть * **Логи.** Они лежат в файлах. Чтобы понять, что сломалось, надо залезть на сервер, открыть правильный лог, вспомнить формат. * **Мониторинг.** Хочется понять: «Сегодня всё собралось или нет?», а не лазить по каталогам и grep’ом искать “ERROR”. * **Повторный прогон периода.** В январе Ozon внёс изменения в API. Полмесяца вы собирали данные неправильно. Теперь нужно **пересчитать только январь**. В systemd это превращается в магию с параметрами и руками в консоли. * **Зависимости.** Скрипт транзакций должен запускаться **только после** того, как обновились справочники товаров. Cron и systemd не умеют в это по-человечески. Даже если прикрутить Grafana и Prometheus, вы всё равно видите только «упало / не упало». Понять «где и почему» — отдельный квест. **Вывод.** systemd и cron подходят как временное решение или для одной-двух простых задач. Но для стабильного DWH продавца маркетплейсов этого мало. ## 3. Почему не взять Enterprise-решение и забыть На рынке полно больших красивых решений: * Azure Data Factory * Microsoft Synapse / Integration Services * Snowflake с их пайплайнами * Databricks и прочие крупные платформы У них есть плюсы: * удобный интерфейс, * куча интеграций, * готовые коннекторы. Но есть три «но»: 1. **Цена.** Для оборота 100–500 млн ₽ в год это часто слишком тяжёлая пушка. Подписка, лицензии, консалтинг — счёт идёт на десятки и сотни тысяч евро в год. 2. **Юрисдикция и доступность.** Часть решений недоступна для компаний, связанных с Россией. Ограничения, санкции, вопросы комплаенса. 3. **Избыточность.** Вам не нужен Greenplum-кластёр, Spark-ферма и Kafka-зоопарк, если вы работаете с данными одной компании, а не всего рынка. Наши клиенты обычно хотят **простую, понятную и свою** систему: * которая живёт на их серверах или в их облаке, * которую можно объяснить владельцу бизнеса за 10 минут, * которую не страшно поддерживать несколько лет. Отсюда логичный выбор — **open-source движок**, который можно развернуть, настроить и забыть. ## 4. Почему мы используем Airflow Airflow — это открытый инструмент Apache для оркестрации ETL-процессов. Работает по простому принципу: * вы описываете задачи на Python, * объединяете их в DAG (граф), * Airflow сам решает, что, когда и в каком порядке запускать. Что важно для бизнеса: * **Есть UI.** Не нужно заходить на сервер и читать логи в vim. Открыл браузер — видишь, какие задачи зелёные, какие красные. * **Видно дерево задач.** Понятно, что за чем идёт: сначала справочники, потом транзакции, потом витрины. * **Есть история.** Можно посмотреть, что происходило вчера, месяц назад, год назад. * **Есть перезапуск.** Можно выбрать интервал (например, январь), нажать пару кнопок — и пересчитать только его. Современный Airflow уже не выглядит как «страшная панель для хакеров». Интерфейс стал нормальным рабочим инструментом, который понимает даже менеджер: зелёное — хорошо, красное — плохо, на задачу можно нажать и прочитать, почему она упала. ## 5. Как Airflow решает реальные проблемы e-commerce Возьмём Ozon. Там десятки видов операций в отчётах: продажи, возвраты, списания, логистика, услуги, штрафы, комиссии. Документация не всегда полная. Часто ошибки описаны одной строкой или не описаны вовсе. Что происходит в реальной жизни: * вы написали код за пару часов; * он работает на тесте; * на проде начинает падать из-за новых редких ошибок и особых типов операций; * половину времени вы тратите не на разработку, а на ловлю исключений. Airflow сильно облегчает эту боль. ### Примеры того, как он помогает * **Retry’и.** Если Ozon временно возвращает ошибку или лимит запросов исчерпан, задача сама попробует ещё раз через заданный интервал. * **Разные ветки поведения.** Можно описать логику: — если ошибка вот такая — попробуй другой API-ключ; — если вот такая — подожди и повтори; — если совсем критично — остановись и пошли уведомление. * **Уведомления.** Упала задача по транзакциям — Airflow может отправить сообщение в Telegram или на почту ответственного. * **Чёткое место падения.** Вы видите не просто «скрипт transactions.py упал». Вы видите: «задача “Загрузка транзакций за 2025-01-18” упала на шаге “Запись в таблицу fact_transactions” из-за такой-то ошибки». Вместо хаоса вы получаете **список конкретных задач**, с которыми можно работать. ## 6. Для техдиров: что происходит под капотом **Для техдиров.** Если кратко, мы используем Airflow как оркестратор поверх обычного Python-кода. Типичный стек для продавца маркетплейсов: * **PostgreSQL** для «операционного» слоя и части витрин; * **ClickHouse** для тяжёлой аналитики по транзакциям и длинной истории; * коннекторы к Ozon / Wildberries / рекламным сетям; * Airflow управляет расписанием и зависимостями. Почему без тяжёлой артиллерии вроде Greenplum и Kafka можно жить спокойно: * мы работаем с данными **одной компании**, а не всего рынка; * размеры данных обычно измеряются десятками/сотнями миллионов строк, а не миллиардами в день; * нагрузка предсказуемая: ночные джобы, дневные дельты, иногда — ближе к real-time по узким местам. Чаще всего хватает схемы: * **staging** — сырые JSONB из API; * **core** — нормализованные fact/ dim таблицы; * **marts** — витрины под аналитику и отчёты. Airflow при этом: * запускает пайплайны по расписанию или по событиям; * даёт единый слой наблюдаемости; * позволяет безопасно дорабатывать DAG’и и возвращаться к старым версиям логики. Нам важнее, чтобы система была **простой и прозрачной**, чем гипер-оптимальной и сложной. ## 7. Как устроено хранилище продавца Ozon (и чем тут помогает SCD2) В хранилище маркетплейсов есть два типа таблиц: 1. **Измерения (dim).** Товары, бренды, категории, склады, партнёры. 2. **Факты (fact).** Транзакции, остатки, цены, рекламные показы/клики/расходы. У измерений есть неприятная особенность: всё постоянно меняется. * название товара правят маркетологи; * карточка переезжает в другую категорию; * меняется бренд, упаковка, поставщик. Если просто переписывать данные «поверх», вы теряете историю: почему в отчёте за прошлый год товар уже называется по-новому. Поэтому мы используем **SCD-2 (slowly changing dimensions, тип 2)**: * старая версия строки помечается как «историческая»; * новая версия создаётся с актуальными данными и датами действия. Выглядит страшно только на словах. На практике: * в каждой dim-таблице немного объектов, * изменения случаются не так часто, * нагрузка на SCD-обновления невысокая. Зато бизнес видит честную картину: * как выглядел ассортимент год назад, * какие бренды тогда были активны, * какие цены были реально в тот период. Airflow здесь нужен как «оркестратор, который не забудет»: * сначала обновить измерения (SCD2), * затем факты транзакций, * затем витрины. ## 8. Что видит владелец бизнеса в итоге После внедрения нормального ETL-движка и DWH у вас появляется не «таблица ради таблицы», а **несколько очень конкретных эффектов**: 1. **Один источник правды.** Больше нет споров «в Excel одно, в личном кабинете другое, в отчёте директора третье». Все смотрят в одни и те же витрины. 2. **Прозрачная юнит-экономика.** Можно честно посчитать: какой SKU в плюс, какой в минус, где маркетинг сжирает маржу, а где помогает. 3. **Контроль остатков и заказов.** Можно видеть, где вы «висящие» товары, где опасность out-of-stock, где наоборот излишки на складах. 4. **Адекватная аналитика рекламы.** Расходы, показы, клики, заказы и маржа оказываются в одной таблице, а не в пяти разных выгрузках. 5. **Понятная картина по каналам.** Ozon, Wildberries, Яндекс.Маркет и другие источники складываются в общую картинку, а не живут отдельными мирками. И главное — вы **перестаёте зависеть от отдельных людей и их файлов**. Система становится частью инфраструктуры, как склад или бухгалтерия. ## 9. Сколько реально нужен дата-инженер Самый частый страх: «Сейчас мы залезем в эту историю с DWH, и потом нам всю жизнь придётся держать дорогого дата-инженера на фулл-тайм». Мы считаем, что **это неправильная постановка вопроса**. Идеальная картина выглядит так: 1. **0–12 месяцев.** Идёт активное внедрение: * проектирование архитектуры, * интеграции с маркетплейсами и внутренними системами, * построение DWH, * настройка Airflow и всех пайплайнов, * первые витрины и отчёты. Здесь действительно нужна плотная работа дата-инженера. Это инвестиционный этап. 2. **После запуска.** Система стабилизируется. Основные пайплайны работают, ошибки пойманы и обработаны, архитектура понятна. Дальше объём задач резко падает: * иногда подключить новый отчёт или API; * доработать схему под новый продукт; * оптимизировать тяжёлый запрос; * адаптировать систему под рост бизнеса. В большинстве случаев для компании с оборотом **от 100 млн ₽ в год** достаточно **около 200 часов работы дата-инженера в год**. Это примерно полтора месяца плотной занятости, растянутых на двенадцать месяцев. Остальное время: * систему можно спокойно поддерживать силами аналитиков и тех, кто отвечает за отчётность, * дата-инженер подключается по мере необходимости: для архитектурных решений и сложных изменений. Важно честно проговорить это с самого начала: **цель хорошего DWH — не посадить к нему навечно отдельного человека, а сделать так, чтобы система жила с минимальными регулярными затратами.** ## 10. Роль аналитиков: как экономить КАПЕКС и не зависеть от подрядчика У многих компаний сейчас сильные аналитики. Они умеют: * писать SQL; * работать в BI-инструментах; * понимать бизнес-вопросы. Мы считаем неправильным строить систему, в которой аналитик ничего не может без дата-инженера. Поэтому мы проектируем DWH и ETL так, чтобы: * **аналитик мог сам заводить новые витрины**, не ломая архитектуру; * типовые операции (новый KPI, дополнительный срез, фильтры) не требовали вмешательства дата-инженера; * документация и схемы были понятны внутри компании. Это экономия КАПЕКС и OPEX: * вы платите за сложную работу архитектору/дата-инженеру, * а дальнейшая эксплуатация обходится дешевле, потому что большую часть задач закрывают сотрудники, которые и так у вас в штате. ## 11. Для техдиров: как мы строим пайплайны в Airflow **Для техдиров.** Немного конкретики. ### DAG’и и переиспользуемые блоки Мы стараемся, чтобы внутри DAG’ов: * шаги были максимально типовыми; * повторяющиеся куски логики оформлялись в общие функции и классы; * конфигурация (какие отчёты тянуть, какие таблицы обновлять) жила отдельно от кода. Так получается библиотека блоков: * «забрать отчёт из Ozon», * «проверить лимиты API», * «загрузить в staging», * «обновить SCD2-измерение», * «пересчитать витрину». DAG при этом становится не монолитом на 500 строк, а комбинацией понятных шагов. ### Ошибки, лимиты и токены Маркетплейсы любят: * менять форматы отчётов; * вводить новые типы операций; * ограничивать число запросов в секунду. Поэтому в DAG’ах мы: * описываем **retry-стратегии** для разных типов ошибок; * учитываем **лимиты по API** (например, не более N запросов в секунду); * закладываем использование **нескольких ключей** с разными ролями, чтобы не блокировать аналитику. Основной принцип: ошибка должна быть **локализована** (по конкретному шагу) и **понятна** (в логе написано, что именно не устроило API). ## 12. Наш опыт: что мы уже пережили за вас Мы строили пайплайны для разных компаний, которые торгуют на маркетплейсах. В процессе: * столкнулись с неполной документацией Ozon и Wildberries; * ловили редкие ошибки в операциях, о которых в доках не было ни слова; * разбирались с лимитами и особенностями отчётности; * понимали, что сначала код пишется за несколько часов, а вот вычищать исключения можно целый месяц. На этой базе мы: * собрали набор типовых блоков и подходов для Airflow; * сформировали архитектуру хранилища, которая хорошо живёт именно в e-commerce; * привыкли проектировать систему так, чтобы через год она не требовала тотальной переделки. ## 13. Чек-лист для владельца бизнеса перед решением Если вы сейчас думаете о своём DWH и ETL-движке, попробуйте ответить на несколько вопросов: 1. Ваш оборот по маркетплейсам **выше 100 млн ₽ в год**? Если да — хранилище почти точно окупится. 2. Сегодня у вас есть **один источник правды** по выручке, марже и остаткам? Или в компании несколько разных таблиц «с настоящими цифрами»? 3. Вы можете **открутить время назад** и честно посмотреть, как выглядел ассортимент и цены год назад? 4. Что происходит, если **сотрудник, который ведёт вашу Excel-таблицу, уйдёт**? Система останется или рухнет? 5. Сколько людей и часов в месяц уходит на ручные выгрузки, своды, перепроверки? Если на эти вопросы неприятно отвечать — вероятно, пора думать о нормальном DWH и движке для ETL. Airflow — не единственный вариант. Но это **разумный баланс** между: * контролем, * прозрачностью, * стоимостью владения. Мы в Koveh Studio выбрали его как основной инструмент для оркестрации. И наша главная задача — не привязать вас к себе навечно, а так построить систему, чтобы через год она жила на 200 часов дата-инженера в год и усилиях ваших аналитиков. Если после этого текста вы сможете прийти к любому подрядчику и задать правильные вопросы по DWH и Airflow — значит, мы свою задачу решили. > Текст записан на диктофон, улучшен через ChatGPT-5.1 и отредактирован Даниилом Ковехом.