Перейти к основному содержимому

Использование 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', чтобы изменять модели в конце пайплайна, обращаясь к моделям production-окружения вместо запуска всех вышестоящих моделей.

При использовании --defer dbt разрешает вызовы {{ ref() }}(Версии dbt: v1.11 и новее) и {{ function() }} в следующем порядке.

  1. Если версия объекта базы данных, к которому применяется defer, существует в окружении разработки, dbt при разрешении ссылки отдает предпочтение его расположению в базе данных разработки.
  2. Если версии в окружении разработки нет, dbt использует расположения родительских объектов базы данных в staging-окружении на основе метаданных этого окружения.
  3. Если нет ни версии в окружении разработки, ни 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 для более интеллектуальной работы 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 будет:

  1. Загружать последний манифест из staging- или production-окружения для сравнения
  2. Передавать команде флаг --defer (для любой команды, поддерживающей этот флаг)

Например, если вы начнете разработку в новой ветке, когда в вашей схеме разработки ничего нет, измените одну модель и выполните dbt build -s state:modified — запустится только измененная модель. Все вызовы {{ ref() }}(Версии dbt: v1.11 и новее) и {{ function() }} будут разрешаться в расположения соответствующих моделей(Версии dbt: v1.11 и новее) и пользовательских функций в staging- или production-окружении.

Активируйте переключатель 'Defer to production' в правом нижнем углу панели команд, чтобы включить defer в Studio IDE.Активируйте переключатель 'Defer to production' в правом нижнем углу панели команд, чтобы включить defer в Studio IDE.

Defer в dbt platform CLI​

Одно из ключевых отличий использования --defer в dbt platform CLI и Studio IDE заключается в том, что в dbt platform CLI --defer включен автоматически для всех вызовов, а сравнение выполняется с артефактами production-окружения. Отключить его можно с помощью флага --no-defer.

(Версии dbt: v2.0 и новее)

Чтобы автоматическое применение defer могло связать ваш проект с настройками, указанными в dbt_cloud.yml, в файле dbt_project.yml необходимо указать идентификатор проекта dbt platform.

dbt_project.yml
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.

Задайте окружение для defer, и имя целевого окружения изменится в пользовательском интерфейсе.Задайте окружение для defer, и имя целевого окружения изменится в пользовательском интерфейсе.
dbt_cloud.yml
context:
active-host: ...
active-project: ...
defer-env-id: '123456'
dbt_project.yml
dbt-cloud:
project-id: '654321'
defer-env-id: '123456'

Нашли ошибку?

0
Loading