Использование defer в dbt
Defer — это мощная возможность, которая позволяет разработчикам собирать, запускать и тестировать только те модели(Версии dbt: v1.11 и новее) и функции, которые они изменили, без необходимости собирать и запускать все предшествующие им модели(Версии dbt: v1.11 и новее) и функции (вышестоящие родительские узлы). Для этого dbt использует манифест production-окружения для сравнения и разрешает вызовы {{ ref() }}(Версии dbt: v1.11 и новее) и {{ function() }} с помощью вышестоящих артефактов production-окружения.
И Studio IDE, и dbt CLI позволяют пользователям обращаться к метаданным production-окружения с помощью встроенной поддержки defer непосредственно в процессе разработки.
Используйте 'defer', чтобы изменять модели в конце пайплайна, обращаясь к моделям production-окружения вместо запуска всех вышестоящих моделей.При использовании --defer dbt разрешает вызовы {{ ref() }}(Версии dbt: v1.11 и новее) и {{ function() }} в следующем порядке.
- Если версия объекта базы данных, к которому применяется defer, существует в окружении разработки, dbt при разрешении ссылки отдает предпочтение его расположению в базе данных разработки.
- Если версии в окружении разработки нет, dbt использует расположения родительских объектов базы данных в staging-окружении на основе метаданных этого окружения.
- Если нет ни версии в окружении разработки, ни staging-окружения, dbt использует расположения родительских объектов базы данных в production-окружении на основе метаданных этого окружения. Обратите внимание: в рамках одного вызова dbt применяет defer только к одному окружению — либо staging, либо production.
Примечание: При передаче флага --favor-state ссылки всегда разрешаются с использованием метаданных staging-окружения, если они доступны; в противном случае используются метаданные production-окружения независимо от наличия объекта базы данных в окружении разработки, а шаг № 1 пропускается.
Чтобы начинать с чистого состояния, рекомендуется удалять схему разработки в начале и в конце цикла разработки.
Если вам нужен дополнительный контроль над данными production-окружения, создайте staging-окружение, и dbt будет использовать его вместо production-окружения для разрешения вызовов {{ ref() }}(Версии dbt: v1.11 и новее) и {{ function() }}.
Варианты настройки
Существует несколько способов настроить defer в dbt в зависимости от конфигурации вашего проекта:
- dbt platform: При использовании Studio IDE или dbt platform CLI defer управляется автоматически. При необходимости можно настроить
defer-env-id, чтобы указать конкретное окружение. Подробнее о настройке см. в разделе Настройка defer на платформе dbt. - Самостоятельно управляемые развертывания (
defer_to_target): Если у вас включен dbt State, задайтеdefer_to_targetвprofiles.yml, чтобы указать, к какому окружению dbt State должен обращаться при использовании defer. Подробнее о настройке см. в разделахdefer_to_targetи Настройка defer в dbt State. - Ручная настройка defer (
--state): Явно передайте--stateили--defer-state, чтобы указать dbt конкретный файлmanifest.json. Подробнее об использовании см. в разделе Defer.
В самостоятельно управляемых развертываниях с включенным dbt State селекторы state:* могут сравнивать каждый узел с его собственным последним выполнением, а не с единым файлом manifest.json — управлять манифестами не требуется. См. раздел Селекторы state:* на базе dbt State.
Настройка defer на платформе dbt
- Необходимо установить флажок Production environment на странице Environment Settings.
- Его можно установить для одного окружения развертывания в каждом проекте dbt.
- Сначала необходимо успешно выполнить задание.
При использовании defer для сравнения берутся артефакты последнего успешно выполненного задания в production-окружении, за исключением заданий CI.
В следующих разделах описано, как включить и настроить defer в Studio IDE и dbt platform CLI, а также как выбрать окружение, к которому dbt обращается при использовании defer.
Defer в dbt IDE
Чтобы использовать defer в Studio IDE, необходимы артефакты production-окружения, созданные заданием развертывания. dbt сначала проверит наличие этих артефактов в staging-окружении (если оно доступно), а затем — в production-окружении.
Функция defer в Studio IDE не будет работать, если staging-окружение существует, но в нем еще не запускалось задание развертывания. Это связано с тем, что необходимые для работы defer метаданные появляются только после успешного выполнения задания развертывания в staging-окружении.
Чтобы включить defer в Studio IDE, активируйте переключатель Defer to staging/production на панели команд. После включения dbt будет:
- Загружать последний манифест из staging- или production-окружения для сравнения
- Передавать команде флаг
--defer(для любой команды, поддерживающей этот флаг)
Например, если вы начнете разработку в новой ветке, когда в вашей схеме разработки ничего нет, измените одну модель и выполните dbt build -s state:modified — запустится только измененная модель. Все вызовы {{ ref() }}(Версии dbt: v1.11 и новее) и {{ function() }} будут разрешаться в расположения соответствующих моделей(Версии dbt: v1.11 и новее) и пользовательских функций в staging- или production-окружении.
Активируйте переключатель 'Defer to production' в правом нижнем углу панели команд, чтобы включить defer в Studio IDE.Defer в dbt platform CLI
Одно из ключевых отличий использования --defer в dbt platform CLI и Studio IDE заключается в том, что в dbt platform CLI --defer включен автоматически для всех вызовов, а сравнение выполняется с артефактами production-окружения. Отключить его можно с помощью флага --no-defer.
Чтобы автоматическое применение defer могло связать ваш проект с настройками, указанными в dbt_cloud.yml, в файле dbt_project.yml необходимо указать идентификатор проекта dbt platform.
dbt-cloud:
project-id: '654321'
Настройка идентификатора окружения для defer
И Studio IDE, и dbt platform CLI обеспечивают дополнительную гибкость, позволяя выбирать исходное окружение для артефактов defer. Вы можете вручную задать ключ defer-env-id в файле [dbt_project.yml](/reference/dbt_project.yml) (dbt platform CLI и Studio IDE) или dbt_cloud.yml (только dbt platform CLI). По умолчанию dbt отдает предпочтение метаданным из окружения проекта «Staging» (если оно определено). В противном случае используется «Production». Полное описание файла см. в разделе dbt_cloud.yml.
context:
active-host: ...
active-project: ...
defer-env-id: '123456'
dbt-cloud:
project-id: '654321'
defer-env-id: '123456'
