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

О dbt State

dbt State помогает dbt точнее определять, что нужно строить. Вместо того чтобы перестраивать каждый узел при каждом запуске, dbt повторно использует узлы: клонирует их из другого расположения или пропускает перестроение, если логика и данные не изменились.

С dbt State при каждом запуске dbt сначала сравнивает логику и данные каждого узла с предыдущими построениями в разных средах — независимо от того, выполняется ли оркестрация в dbt platform, через ваш собственный оркестратор или в среде разработки. Если логика совпадает, а данные всё ещё актуальны, dbt повторно использует существующий объект. Вместо нового построения dbt либо клонирует существующий узел из другого расположения, либо пропускает выполнение уже существующей модели. Кроме того, dbt автоматически использует состояние производственной среды для разрешения ссылок, не требуя вручную задавать флаги --defer или --state.

dbt State может повторно использовать все типы узлов, которые создают объекты отношений в базе данных (например, SQL-модели, снимки и seeds), а также тесты данных. Обратите внимание, что следующие модели не подходят для повторного использования:

  • Python-модели: dbt State строит Python-модели при каждом запуске, даже если их код и данные вышестоящих узлов не изменились.
  • Модели с пользовательскими материализациями: dbt State строит эти модели при каждом запуске, поскольку пользовательские материализации могут иметь побочные эффекты (например, изменять свойства таблиц или записывать данные в другие схемы), и dbt State не может достоверно определить, даст ли пропуск выполнения тот же результат.

dbt State работает с dbt (v1 и v2) и dbt platform во всех средах и с любыми оркестраторами, обеспечивая гибкий подход независимо от способа запуска dbt. Для работы требуется аутентификация через учётную запись dbt platform. Сведения о ценах см. в разделе Использование и стоимость dbt State.

Преимущества​

dbt State снижает затраты на вычисления в хранилище данных и упрощает разработку, оркестрацию и выполнение dbt:

  • Более актуальные данные при меньших затратах: узлы перестраиваются только тогда, когда результат будет отличаться (при появлении новых данных или изменениях кода), что сокращает вычисления в хранилище и поддерживает актуальность данных в производственной среде.
  • Более быстрая и простая разработка: без dbt State при разработке в новой схеме необходимо строить вышестоящие зависимости, поддерживать копии для разработки или настраивать --defer с манифестом состояния. С dbt State ничего из этого не требуется: dbt находит наиболее актуальное доступное состояние во всех средах, клонирует актуальные вышестоящие объекты данных и перестраивает только то, что изменилось.
  • Более простая оркестрация: решения об оркестрации обычно принимаются на уровне заданий — какие узлы входят в задание и как часто оно должно выполняться. dbt State добавляет принятие решений на уровне узлов в рамках каждого запуска: вместо перестроения всех выбранных узлов dbt оценивает каждый из них отдельно и решает, следует ли его перестроить, клонировать или пропустить, исходя из его логики и актуальности данных. В отличие от стандартного механизма отложенного разрешения ссылок, который всегда строит выбранные узлы и использует внешнее состояние только для ссылок на невыбранные вышестоящие узлы, dbt State также может пропускать или клонировать выбранные узлы.
  • Порог актуальности на уровне модели: настройка lag_tolerance определяет, сколько времени dbt State ожидает перед перестроением узла после изменения данных в вышестоящих узлах. Узел перестраивается только в том случае, если с его последнего построения прошло больше времени, чем допускает заданный интервал, и данные вышестоящих узлов изменились. Это позволяет нижестоящим моделям не зависеть от частых изменений вышестоящих узлов и предотвращает дорогостоящие перестроения на неизменившихся данных, когда вышестоящая зависимость не выполняет соглашение об уровне обслуживания (SLA) в отношении актуальности.

Как работает dbt State​

При выполнении команды, например dbt build --select +my_model, dbt State оценивает каждый выбранный узел и применяет наиболее эффективный из доступных подходов:

  • Повторное использование узла из той же схемы (пропуск) — dbt проверяет, существует ли объект в целевой схеме, не изменилась ли его логика и не наступило ли время перестроения согласно его настройке lag_tolerance (либо с последнего построения ещё не истёк допустимый интервал, либо данные вышестоящих узлов не изменились). Если все условия выполнены, dbt полностью пропускает узел, как если бы он не был выбран. Для тестов данных, если проверяемые узлы не изменились с последнего запуска, повторно используется предыдущий результат теста без повторного выполнения тестового запроса.

    Если логика представления не изменилась, dbt State повторно использует его, даже если в вышестоящих узлах появились новые данные. Поскольку представления не хранят данные, новые данные вышестоящих узлов автоматически отражаются при запросе к представлению, даже без перестроения. Обратите внимание, что представления, использующие select * для вышестоящего узла, могут вести себя иначе — подробнее см. в разделе Представления с select *.

  • Повторное использование узла из другой схемы (клонирование) — dbt State ищет во всех средах и заданиях подходящий объект с идентичной логикой и актуальными данными. В поиск включаются и схемы, в которых модель была построена до её первого запуска в производственной среде. Если найдено несколько кандидатов, dbt State клонирует объект с наиболее актуальными данными независимо от того, из какой среды он получен. Например, если в схеме CI данные актуальнее, чем в производственной среде, а логика идентична, dbt State клонирует объект оттуда. Узел помечается как Reused, а затраты на вычисления составляют лишь малую долю затрат на построение.

    Если вы хотите запретить клонирование в определённую целевую конфигурацию (например, в средах с нормативными ограничениями), задайте для неё allow_clones: false в profiles.yml или в качестве расширенного атрибута в dbt platform.

  • Обычное построение — если повторное использование невозможно, dbt строит узел обычным способом, автоматически используя внешнее состояние для разрешения ссылок на невыбранные вышестоящие узлы.

В начале каждого запуска dbt State в фоновом режиме получает метаданные таблиц (например, временные метки последнего изменения). Любой узел, для которого уже определено действие — пропуск, клонирование или выполнение, — сразу переходит к нему; узлы с ещё не определённым действием ожидают завершения получения метаданных.

Без dbt State каждый выбранный узел перестраивается при каждом запуске независимо от того, изменилось ли что-либо.

Чтобы после запуска узнать, какое решение dbt State принял для каждого узла и почему, выполните команду (Версии dbt: v2.0 и новее) dbt state explain. Если вы используете dbt platform, та же информация доступна без выполнения команды — перейдите на вкладку Explain на странице сведений о запуске задания, чтобы увидеть полный разбор решений для каждого узла.

Полный список доступных настроек см. в разделе Настройки dbt State.

 Как dbt State решает, нужно ли перестроить, клонировать или повторно использовать узел

Следующее дерево решений показывает, как dbt State выбирает наиболее эффективное допустимое действие для каждого узла.

Дерево решений, показывающее, как dbt State выбирает перестроение, клонирование или повторное использование узла с учётом обхода проверок состояния, обработки недетерминированного SQL, хешей выполнения, актуальности, совпадения схем, возможности клонирования и того, можно ли ещё клонировать актуальные данные вышестоящих узлов из истории изменений (time travel) или другой схемыДерево решений dbt State для перестроения, клонирования и повторного использования

Основная идея заключается в том, что dbt State пропускает работу только тогда, когда может доказать достаточную эквивалентность существующего объекта для текущего запуска. Если SQL-логика, значимые настройки, схема или актуальность вышестоящих данных указывают на то, что результат может отличаться, dbt вместо этого выполняет перестроение.

Использование dbt State с селекторами state:* Бета-версия​

В самостоятельно управляемых развёртываниях dbt State также можно использовать с селекторами state:*. Вместо сравнения с одним файлом manifest.json эти селекторы используют dbt State как источник для сравнения, причём состояние отслеживается для каждого узла отдельно. Подробнее см. в разделе Селекторы state:* на основе dbt State.

Регистрация для работы с dbt State​

Для аутентификации dbt State требуется учётная запись dbt platform, даже если вы запускаете dbt локально или в неинтерактивной среде.

  • Существующие пользователи dbt platform: ваши учётные данные dbt State совпадают с учётными данными платформы, а dbt State имеет доступ к вашим средам и заданиям на платформе.
  • Новые пользователи dbt platform: создайте учётную запись на странице регистрации dbt platform. Пользователи dbt v2 и v1 могут начать процесс создания учётной записи из CLI, выполнив dbt login (v1.13/v2) или dbt run/dbt build (dbt v1.7–1.12). Эта команда откроет страницу регистрации, где можно создать бесплатную учётную запись.

Инструкции по настройке см. в разделе Настройка dbt State.

Приложение dbt State больше не поддерживается

Отдельное приложение dbt State (app.state.dbt.com) больше не принимает новых пользователей. Если у вас уже есть учетная запись в приложении dbt State, создайте бесплатную учетную запись dbt platform, чтобы продолжить использовать dbt State — ваш бесплатный пробный период будет продлен при создании учетной записи.

Часто задаваемые вопросы​

Что произошло с оркестрацией с учетом состояния?
Чем dbt State отличается от использования state:modified?
Поддерживает ли dbt State инкрементальные модели?
Поддерживает ли dbt State модели Python?
Как хранятся данные в dbt State?
Откуда берутся метаданные о времени последнего обновления?
Как dbt State определяет, что модель изменилась?
Почему моя модель пересоздаётся, а не используется повторно?
Что происходит при сбое серверов dbt State?
Что делать, если я работаю над несколькими проектами, каждый из которых использует собственный dbt State?
Что делать, если моя среда prod называется не prod?

Связанная документация​

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

0
Loading