Использование defer в dbt
Defer — это мощная возможность, которая позволяет разработчикам собирать, запускать и тестировать только те модели, которые они изменили, без необходимости предварительно запускать и строить все модели, от которых они зависят (upstream-родители). dbt реализует это, используя production manifest для сравнения и разрешая функцию {{ ref() }} через upstream-артефакты из production.
И Studio IDE, и CLI dbt позволяют пользователям нативно откладываться (defer) к метаданным production прямо в процессе разработки.
Используйте 'defer' для изменения моделей в конце пайплайна, указывая на production-модели вместо запуска всего upstream.При использовании --defer dbt следует следующему порядку выполнения при разрешении функций {{ ref() }}:
- Если существует версия отложенной (deferred) relation в среде разработки, dbt в первую очередь использует расположение в базе данных разработки для разрешения ссылки.
- Если версии в среде разработки не существует, dbt использует staging-расположения родительских relations на основе метаданных из Staging-окружения.
- Если не существует ни версии в разработке, ни Staging-окружения, dbt использует production-расположения родительских relations на основе метаданных из Production-окружения. Обратите внимание, что dbt откладывается только к одному окружению за один запуск — либо staging, либо production.
Примечание: Передача флага --favor-state всегда будет разрешать refs с использованием staging-метаданных (если они доступны); в противном случае используется production-метаданные, независимо от наличия relation в среде разработки, пропуская шаг №1.
Для чистого старта рекомендуется удалять схему разработки в начале и в конце цикла разработки.
Если вам требуется дополнительный контроль над production-данными, создайте Staging environment, и dbt будет использовать его, а не Production-окружение, для разрешения функций {{ ref() }}.
Необходимая настройка
- Необходимо выбрать флажок Production environment на странице Environment Settings.
- Это можно сделать только для одного deployment-окружения в рамках проекта dbt.
- Должен быть хотя бы один успешный запуск job.
При использовании defer выполняется сравнение артефактов из самого последнего успешного production job, за исключением CI job.
Defer в dbt IDE
Чтобы использовать defer в Studio IDE, у вас должны быть production-артефакты, сгенерированные deploy job. dbt сначала проверит наличие этих артефактов в Staging-окружении (если оно существует), и только затем — в Production-окружении.
Функция defer в Studio IDE не будет работать, если Staging-окружение существует, но ни один deploy job в нём ещё не выполнялся. Это связано с тем, что необходимые метаданные для работы defer появляются только после успешного выполнения deploy job в Staging-окружении.
Чтобы включить defer в Studio IDE, переключите кнопку Defer to staging/production в командной панели. После включения dbt выполнит следующие действия:
- Загрузит самый последний manifest из Staging или Production-окружения для сравнения
- Передаст флаг
--deferв команду (для любой команды, которая поддерживает этот флаг)
Например, если вы начинаете разработку в новой ветке с пустой схемой разработки, редактируете одну модель и запускаете dbt build -s state:modified, то будет выполнена только изменённая модель. Все функции {{ ref() }} будут указывать на staging- или production-расположения соответствующих моделей.
Выберите переключатель 'Defer to production' в правом нижнем углу командной панели, чтобы включить defer в Studio IDE.Defer в dbt CLI
Одно из ключевых отличий использования --defer в Cloud CLI по сравнению с Studio IDE заключается в том, что --defer автоматически включён в Cloud CLI для всех запусков при сравнении с production-артефактами. Вы можете отключить его с помощью флага --no-defer.
Cloud CLI предоставляет дополнительную гибкость, позволяя выбирать окружение-источник артефактов для defer. Вы можете вручную указать ключ defer-env-id либо в файле dbt_project.yml, либо в dbt_cloud.yml. По умолчанию Cloud CLI предпочитает метаданные из Staging-окружения проекта (если оно определено), в противном случае — из Production.
context:
active-host: ...
active-project: ...
defer-env-id: '123456'
dbt-cloud:
defer-env-id: '123456'