Загрузка падает молча
Скрипт запускается по cron, падает с ошибкой подключения и об этом никто не знает до момента, когда руководитель открывает отчёт, а данных за вчера нет. Иногда ошибку замечают через неделю.
Выберите тему — соберём контекст
Строим конвейеры загрузки и преобразования данных: расписание и зависимости, ретраи, алерты, идемпотентные перезапуски, проверки качества и понятный процесс догрузки истории после сбоя.
Или сразу: +7 (962) 368-39-51 Telegram
Большинство проблем в конвейерах не связано с технологией: это отсутствие проверок, идемпотентности и наблюдаемости.
Скрипт запускается по cron, падает с ошибкой подключения и об этом никто не знает до момента, когда руководитель открывает отчёт, а данных за вчера нет. Иногда ошибку замечают через неделю.
После сбоя оператор запускает скрипт заново, и вчерашние заказы вставляются второй раз. Отчёт показывает рост продаж, которого не было, а найти источник дублей удаётся не сразу.
Из источника забираются только строки с датой изменения. Удалённые записи остаются в витрине навсегда, а обновления статусов, сделанные без смены даты, теряются.
В 1С переименовали реквизит, в API маркетплейса добавили обязательное поле, и загрузка останавливается или пишет NULL в витрину. Тихая порча данных опаснее явной ошибки.
Пароли к базам, токены API и учётные записи FTP прописаны прямо в коде cron-скриптов. Уходит сотрудник — вместе с ним уходит и понимание, какие доступы нужно отозвать.
Загрузка формально успешна: строки есть. Но в них отрицательные суммы, дубли по номеру заказа, ссылки на несуществующих клиентов и нулевые ключи — и всё это уже в отчёте.
От разбора текущих скриптов до конвейера с расписанием, тестами и алертами в мессенджер.
Собираем загрузки в управляемый граф зависимостей вместо набора cron-задач, которые запускаются «примерно в одно время».
Забираем данные из всех систем, где они появляются, выбирая способ под нагрузку и требования к свежести.
Описываем преобразования кодом в репозитории, чтобы их можно было проверить, отревьюить и раскатить как обычный релиз.
Проектируем процесс так, чтобы сбой был рутинным событием, а не аварией с ручной правкой данных.
Начинаем с инвентаризации того, что уже работает, — обычно часть скриптов можно использовать как основу.
Собираем список источников, текущих скриптов, расписаний и известных проблем. Фиксируем требования к свежести данных по каждому отчёту.
Поднимаем Airflow, переносим критичные загрузки, настраиваем ретраи, алерты и логирование запусков.
Переносим логику из скриптов в dbt-модели, добавляем тесты качества и защиту от дублей, настраиваем backfill.
Описываем регламент: как читать алерты, как догрузить период, как добавить источник. Передаём команде или берём на поддержку.
В классическом ETL преобразование происходит до загрузки: данные очищаются и обогащаются на стороне процесса, и в хранилище попадает уже подготовленная структура. В ELT сначала загружается сырой слепок из источника, а преобразования выполняются средствами самого хранилища — как правило, SQL-моделями dbt. Второй подход стал основным там, где хранилище достаточно мощное, потому что сырые данные остаются доступны для пересборки и разбора инцидентов.
На практике мы чаще строим гибрид: из источников данные забираются в слой raw максимально близко к оригиналу, включая технические поля вроде времени изменения и идентификатора загрузки, а преобразования живут в dbt-моделях поверх него. Это даёт воспроизводимость: любую витрину можно пересобрать заново из сырых данных, не обращаясь повторно к рабочей системе.
Идемпотентность означает, что повторный запуск процесса за тот же период не изменяет результат. Это главное свойство надёжного конвейера: сбои случаются всегда, и реакция на них должна быть скучной — просто запустить шаг снова. Без идемпотентности восстановление превращается в ручную чистку дублей, а иногда и в сверку сумм с бухгалтерией.
Мы добиваемся этого несколькими приёмами: загрузка периода выполняется в staging-таблицу с последующим merge по ключу и дате, для каждого запуска фиксируется окно загрузки и watermark, а вставки сопровождаются идентификатором загрузки. Для инкрементальных моделей задаётся уникальный ключ, а удаления обрабатываются отдельно — через сравнение снимков или через CDC. Проверка простая: запускаем один и тот же период дважды и убеждаемся, что количество строк и контрольные суммы не изменились.
Доверие к данным строится не на обещаниях, а на проверках, которые выполняются автоматически при каждой загрузке. Мы настраиваем четыре группы тестов. Структурные — на схему: наличие обязательных колонок, соответствие типов, отсутствие NULL в ключах. Логические — на допустимые значения: сумма неотрицательна, статус входит в справочник, дата не из будущего.
Связностные тесты проверяют ссылочную целостность: каждая позиция заказа ссылается на существующий заказ и товар. И, наконец, объёмные: количество строк и сумма за день не отличаются от обычного диапазона более чем на заданный процент. Если тест падает, витрина не обновляется, а дежурный получает уведомление с конкретной причиной — это лучше, чем отчёт с тихо испорченными цифрами.
Для двух-трёх загрузок в сутки иногда достаточно cron и небольших скриптов с логированием. Airflow становится нужен, когда появляются зависимости между шагами, потребность в ретраях, разделении по расписанию и наглядной истории запусков. Мы не усложняем инфраструктуру заранее: если нагрузка небольшая, делаем простое решение, а оркестратор подключаем тогда, когда он реально экономит время дежурства.
Это типовая ситуация: документы проводятся позже даты операции, статусы пересчитываются, возвраты уменьшают выручку прошлых периодов. Мы обрабатываем её явно: витрина строится с окном пересчёта, например последние 30 дней перезагружаются при каждом запуске, а изменения фиксируются в истории. Так отчёт за прошлый месяц всегда актуален и при этом можно увидеть, как цифра менялась.
Один источник с одной таблицей переносится за день-два: переносим логику, добавляем идемпотентность и тесты. Источники с историей, справочниками и неочевидной логикой обновлений — например 1С или маркетплейсы — занимают от недели до трёх, потому что требуют разбора бизнес-правил. Обычно мы предлагаем начать с двух самых критичных источников и дальше идти по приоритету.
Каждый запуск пишет статус, длительность и количество обработанных строк. Настраиваются два уровня контроля: технический — упал шаг, превышено время, не прошёл тест; бизнесовый — данных за период меньше ожидаемого, сумма отклонилась от нормы. Алерты приходят в Telegram или на почту дежурному, а история запусков доступна в веб-интерфейсе оркестратора.
Смежные задачи, которые обычно решаются в одном проекте с этой.
Опишите, из каких систем и с какой периодичностью нужно забирать данные, — предложим схему конвейера и сроки.
Cookie и аналитика
Мы используем необходимые cookie для работы сайта и форм. Аналитические cookie (Яндекс.Метрика, включая запись сессий) подключаем только с вашего согласия — от него можно отказаться. Подробнее: Политика использования cookie и обработка персональных данных.