Оптимизация сборок dbt
По умолчанию dbt пересобирает каждый выбранный узел при каждом запуске — даже если ничего не изменилось. Это упрощает начало работы, но в крупных проектах приводит к увеличению времени выполнения заданий, росту затрат на хранилище данных и замедлению обратной связи при разработке. В dbt есть возможности, позволяющие пропускать ненужную работу и повторно использовать существующие результаты.
dbt State
dbt State — это сервис, который помогает dbt более обоснованно выбирать, что нужно собирать. Он интегрируется с любым развертыванием dbt — в том числе с развертываниями в собственной инфраструктуре на базе dbt v2 или dbt v1 — без необходимости оформлять регулярную подписку на dbt platform.
Вместо того чтобы пересобирать каждый узел при каждом запуске, сервис сравнивает логику каждого узла и данные вышестоящих зависимостей с предыдущим запуском и выбирает наиболее эффективный вариант:
- Пропустить — Если логика узла и данные вышестоящих зависимостей не изменились, dbt повторно использует существующий объект в целевой схеме без изменений.
- Клонировать — Если данные актуальны, но находятся в другой схеме (например, в рабочей среде), dbt клонирует их вместо пересборки с нуля.
- Собрать — Если повторное использование невозможно, dbt выполняет обычную пересборку и автоматически перенаправляет ссылки на невыбранные вышестоящие узлы в рабочую среду — флаги
--deferи--stateне требуются.
Чтобы включить dbt State:
-
dbt v1.7–1.12:
cd path/to/your/project
pip install dbt-state -
dbt v2:
cd path/to/your/project
dbt login
Для аутентификации требуется учетная запись dbt platform с бесплатным пробным периодом на 30 дней. Стоимость dbt State зависит от использования — плата взимается за каждую целевую таблицу, которую dbt State повторно использует в течение дня, а не за каждое пользовательское место в dbt platform. Полные инструкции по настройке приведены в разделе Настройка dbt State.
Отложенное разрешение ссылок
Отложенное разрешение ссылок позволяет собирать часть проекта без предварительной сборки всех вышестоящих зависимостей. Вместо выполнения всех вышестоящих узлов dbt направляет ссылки на несобранные узлы к существующим объектам в другой среде — обычно в рабочей.
Это полезно в средах разработки и CI, когда нужно протестировать одну или две модели, не дожидаясь выполнения всего пайплайна.
dbt build --select my_model --defer --state path/to/prod/artifacts
dbt clone
dbt clone создает копии выбранных узлов в целевой схеме. В хранилищах данных, поддерживающих клонирование без копирования данных (например, Snowflake), команда создает легковесные клоны объектов базы данных без дублирования лежащих в их основе данных. В других хранилищах она создает представления, ссылающиеся на вышестоящие объекты базы данных.
Это полезно при разработке, когда нужно быстро наполнить среду разработки объектами, аналогичными объектам рабочей среды, без выполнения всего пайплайна.
dbt clone --select my_model
Синтаксис выбора узлов в dbt
В dbt есть различные селекторы, с помощью которых можно выбирать определенные части проекта, вместо того чтобы каждый раз собирать всё. Например, +my_model выбирает my_model и все ее вышестоящие зависимости, а my_model+2 выбирает my_model и два уровня нижестоящих зависимых узлов. Это позволяет тестировать изменения изолированно, не выполняя весь проект.
dbt build --select +my_model