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

Клонировать или откладывать, вот в чем вопрос

· 6 мин. чтения
Kshitij Aranke
Doug Beatty

Привет всем, я Кшитидж, старший инженер-программист в команде Core в dbt Labs. Одним из самых крутых моментов в моей карьере здесь было внедрение новой команды dbt clone в рамках выпуска dbt-core v1.6.

Однако один из самых частых вопросов, которые я получаю, касается рекомендаций о том, "когда" клонировать, выходящих за рамки документации о "как" клонировать. В этом блоге я постараюсь дать эти рекомендации, ответив на следующие часто задаваемые вопросы:

  1. Что такое dbt clone?
  2. Чем это отличается от откладывания?
  3. Должен ли я откладывать или клонировать?

Что такое dbt clone?

dbt clone — это новая команда в dbt 1.6, которая использует нативную функциональность клонирования без копирования данных на поддерживаемых хранилищах для копирования целых схем бесплатно и почти мгновенно.

Как это возможно?

Хранилище "читит", копируя только метаданные из схемы source в схему target; исходные данные остаются на месте во время этой операции. Эти метаданные включают материализованные объекты, такие как таблицы и представления, поэтому вы видите клон этих объектов в целевой схеме.

На языке информатики, clone создает копию указателя из схемы source на исходные данные; после операции теперь есть два указателя (схемы source и target), которые указывают на одни и те же исходные данные.

Чем клонирование отличается от откладывания?

На первый взгляд, клонирование и откладывание кажутся похожими — оба способа экономии затрат в хранилище данных. Они делают это, обходя дорогостоящие пересчеты моделей — клонирование активно копирует всю схему в целевую схему, а откладывание лениво ссылается на предварительно построенные модели в исходной схеме.

Давайте разберем это предложение и исследуем его первичные эффекты:

deferclone
Как это использовать?Неявно через флаг --deferЯвно через команду dbt clone
Каковы его результаты?Не создает никаких объектов сам по себе, но dbt может создать объекты в целевой схеме, если они изменились по сравнению с исходной схемой.Копирует объекты из исходной схемы в целевую схему в хранилище данных, которые сохраняются после завершения операции.
Как это работает?Сравнивает манифесты между исходными и целевыми запусками dbt и переопределяет ref, чтобы разрешить модели, не построенные в целевом запуске, указывая на объекты, построенные в исходном запуске.Использует клонирование без копирования, если доступно, для копирования объектов из исходных в целевые схемы, иначе создает указательные представления (select * from my_model)

Эти первичные эффекты приводят к следующим вторичным эффектам, которые действительно отличают клонирование от откладывания:

deferclone
Где я могу использовать объекты, построенные в целевой схеме?Только в контексте dbtВ любом инструменте downstream (например, BI)
Могу ли я безопасно изменять объекты, построенные в целевой схеме?Нет, так как это изменит производственные данныеДа, клонирование — это дешевый способ создать песочницу производственных данных для экспериментов
Будут ли данные в целевой схеме отличаться от данных в исходной схеме?Нет, так как откладывание всегда будет указывать на последнюю версию исходной схемыДа, так как клонирование — это операция в определенный момент времени
Могу ли я использовать несколько исходных схем одновременно?Да, откладывание может динамически переключаться между исходными схемами, например, ссылаться на неизмененные модели из производства и измененные модели из стадииНет, клонирование копирует объекты из одной исходной схемы в одну целевую схему

Должен ли я откладывать или клонировать?

Собрав все вышеперечисленные пункты, вот удобная шпаргалка, когда откладывать и когда клонировать:

deferclone
Экономия времени и затрат за счет избежания пересчета
Создание объектов базы данных для использования в downstream инструментах (например, BI)
Безопасное изменение объектов в целевой схеме
Избегание создания новых объектов базы данных
Избегание дрейфа данных
Поддержка нескольких динамических источников

Чтобы окончательно закрепить эту мысль:

  1. Если вы отправляете кому-то эту шпаргалку, ссылаясь на эту страницу, вы откладываете на эту страницу
  2. Если вы распечатываете эту страницу и пишете заметки на полях, вы клонировали эту страницу

Применение на практике

Используя приведенную выше шпаргалку, давайте рассмотрим несколько распространенных сценариев и выясним, следует ли использовать откладывание или клонирование для каждого из них:

  1. Тестирование стадийных наборов данных в BI

    В этом сценарии мы хотим:

    1. Сделать копию нашего производственного набора данных доступной в нашем downstream BI инструменте
    2. Безопасно итеративно работать с этой копией, не нарушая производственные наборы данных

    Поэтому в этом сценарии мы должны использовать клонирование.

  2. Slim CI

    В этом сценарии мы хотим:

    1. Ссылаться на производственные модели, где это возможно, чтобы ускорить запуски непрерывной интеграции (CI)
    2. Запускать и тестировать только те модели в CI стадии, которые изменились по сравнению с производственной средой
    3. Ссылаться на модели из разных сред — prod для неизмененных моделей и staging для измененных моделей

    Поэтому в этом сценарии мы должны использовать откладывание.

Используйте dbt clone в CI задачах для тестирования инкрементальных моделей

Узнайте, как использовать dbt clone в CI задачах для эффективного тестирования измененных инкрементальных моделей, имитируя поведение после слияния, избегая затрат на полное обновление.

  1. Blue/Green Deployments

    В этом сценарии мы хотим:

    1. Убедиться, что все тесты всегда проходят на производственном наборе данных, даже если этот набор данных немного устарел
    2. Атомарно откатить продвижение в производство, если тесты не проходят по всему стадийному набору данных

    В этом сценарии мы можем использовать клонирование для реализации стратегии развертывания, известной как blue-green deployments, где мы строим весь стадийный набор данных, а затем запускаем тесты против него, и только клонируем его в производство, если все тесты проходят.

Как правило, откладывание лучше подходит для случаев использования непрерывной интеграции (CI), тогда как клонирование лучше подходит для случаев использования непрерывного развертывания (CD).

Завершение

В этом посте мы рассмотрели, что такое dbt clone, чем оно отличается от откладывания и когда использовать каждое из них. Часто они могут использоваться вместе в рамках одного проекта на разных этапах жизненного цикла развертывания.

Спасибо за чтение, и я с нетерпением жду, что вы создадите с помощью dbt clone.

Спасибо Джейсон Ганц и Гвен Виндфлауэр за рецензирование черновиков этой статьи

Comments

Loading