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

Быстрый старт с dbt Mesh

dbt platform
Quickstart
Intermediate
Menu

    Введение

    Mesh — это фреймворк, который помогает организациям эффективно масштабировать команды и данные. Он продвигает лучшие практики управления (governance) и разбивает крупные проекты на управляемые части — что ускоряет разработку аналитики. Mesh доступен для аккаунтов dbt Enterprise.

    В этом руководстве вы научитесь настраивать мультипроектную архитектуру, используя базовые концепции Mesh, а также реализовывать data mesh в dbt:

    • Настроите базовый (foundational) проект под названием “Jaffle | Data Analytics”
    • Настроите downstream‑проект под названием “Jaffle | Finance”
    • Добавите доступ к моделям, версии и контракты
    • Настроите задание dbt, которое запускается после завершения upstream‑задания

    Подробнее о том, почему data mesh важен, читайте в статье: What is data mesh? The definition and importance of data mesh.

    Видео для вас

    Вы можете бесплатно пройти курс dbt Fundamentals, если вам интересен формат обучения с видео.

    Также вы можете посмотреть видео на YouTube про dbt и Snowflake.

    Предварительные требования​

    Чтобы использовать Mesh, необходимо следующее:

    • У вас должен быть аккаунт dbt уровня Enterprise EnterpriseEnterprise +
    • У вас есть доступ к облачной платформе данных, права на загрузку примеров таблиц и разрешения в dbt на создание новых проектов.
    • В этом руководстве используются примерные данные Jaffle Shop, включая таблицы customers, orders и payments. Следуйте инструкциям, чтобы загрузить эти данные в вашу платформу данных:

    Также предполагается, что у вас уже есть опыт работы с dbt или базовые знания. Если вы только начинаете, сначала пройдите курс dbt Fundamentals.

    Создание и настройка двух проектов

    В этом разделе вы создадите два новых пустых проекта в dbt, которые будут использоваться как базовый и downstream‑проекты:

    • Базовые проекты (или upstream‑проекты) обычно содержат основные модели и датасеты, которые служат фундаментом для дальнейшей аналитики и отчетности.
    • Downstream‑проекты строятся поверх этого фундамента и часто добавляют более специфичные трансформации или бизнес‑логику для отдельных команд или задач.

    Например, вымышленная, но всегда предприимчивая компания “Jaffle Labs” создаст два проекта для команд аналитики данных и финансов: Jaffle | Data Analytics и Jaffle | Finance.

    Создайте два новых dbt‑проекта с именами 'Jaffle | Data Analytics' и 'Jaffle Finance'Создайте два новых dbt‑проекта с именами 'Jaffle | Data Analytics' и 'Jaffle Finance'

    Чтобы создать новый проект в dbt:

    1. В Account settings перейдите в Projects. Нажмите New project.
    2. Введите имя проекта и нажмите Continue.
      • Используйте "Jaffle | Data Analytics" для одного проекта
      • Используйте "Jaffle | Finance" для второго проекта
    3. Выберите вашу платформу данных и нажмите Next для настройки подключения.
    4. В разделе Configure your environment введите Settings для нового проекта.
    5. Нажмите Test Connection, чтобы проверить доступ dbt к вашей платформе данных.
    6. Нажмите Next, если тест прошел успешно. Если нет — вернитесь и перепроверьте настройки.
      • Для этого руководства убедитесь, что в каждом проекте создано по одному development и Deployment окружению.
        • Для "Jaffle | Data Analytics" установите базу данных по умолчанию jaffle_da.
        • Для "Jaffle | Finance" установите базу данных по умолчанию jaffle_finance.
    7. Продолжайте следовать подсказкам до завершения настройки проекта. В итоге каждый проект должен иметь:
      • Подключение к платформе данных
      • Новый git‑репозиторий
      • Одно или несколько окружений (например, development, deployment)
    Перейдите в Account settings.Перейдите в Account settings.
    Выберите Projects в меню.Выберите Projects в меню.
    Создание нового проекта в Studio IDE.Создание нового проекта в Studio IDE.
    Задайте имя проекта.Задайте имя проекта.
    Выберите соответствующее подключение для проектов.Выберите соответствующее подключение для проектов.

    Создание production‑окружения

    В dbt каждый проект может иметь одно deployment‑окружение, назначенное как “Production”. Для каждого проекта, который вы хотите объединить в mesh, необходимо настроить "Production" или "Staging" deployment‑окружение. Это позволит использовать Catalog на последующих шагах данного руководства.

    Чтобы настроить production‑окружение:

    1. Перейдите в Deploy -> Environments и нажмите Create New Environment.
    2. Выберите тип окружения Deployment.
    3. В разделе Set deployment type выберите Production.
    4. Выберите версию dbt.
    5. Заполните необходимые поля в разделах Deployment connection и Deployment credentials.
    6. Нажмите Test Connection, чтобы проверить подключение.
    7. Нажмите Save, чтобы создать production‑окружение.
    Назначьте production‑окружение окружением по умолчанию в настройках Environment SettingsНазначьте production‑окружение окружением по умолчанию в настройках Environment Settings

    Настройка базового проекта

    Этот upstream‑проект — место, где вы создаете ключевые дата‑ассеты. Он будет содержать исходные источники данных, staging‑модели и основную бизнес‑логику.

    dbt позволяет специалистам по данным разрабатывать в привычных инструментах и предоставляет как локальный dbt CLI, так и браузерный Studio IDE.

    В этом разделе вы настроите проект “Jaffle | Data Analytics” как базовый, используя Studio IDE.

    1. Сначала перейдите на страницу Develop, чтобы проверить настройку.
    2. Нажмите Initialize dbt project, если вы начали с пустого репозитория.
    3. Удалите папку models/example.
    4. Перейдите к файлу dbt_project.yml и переименуйте проект (строка 5) с my_new_project на analytics.
    5. В файле dbt_project.yml удалите строки 39–42 (ссылку на модель my_new_project).
    6. В File Catalog наведите курсор на директорию проекта, нажмите ... и выберите Create file.
    7. Создайте две новые папки: models/staging и models/core.

    Staging‑слой

    Теперь, когда базовый проект настроен, начнем создавать дата‑ассеты. Настройте staging‑слой следующим образом:

    1. Создайте новый YAML‑файл свойств models/staging/sources.yml.
    2. Объявите источники, скопировав следующий код в файл и нажав Save.
    models/staging/sources.yml

    sources:
    - name: jaffle_shop
    description: This is a replica of the Postgres database used by our app
    database: raw
    schema: jaffle_shop
    tables:
    - name: customers
    description: One record per customer.
    - name: orders
    description: One record per order. Includes cancelled and deleted orders.
    1. Создайте файл models/staging/stg_customers.sql, чтобы выбрать данные из таблицы customers источника jaffle_shop.
    models/staging/stg_customers.sql
    select
    id as customer_id,
    first_name,
    last_name

    from {{ source('jaffle_shop', 'customers') }}
    1. Создайте файл models/staging/stg_orders.sql, чтобы выбрать данные из таблицы orders источника jaffle_shop.
    models/staging/stg_orders.sql
    select
    id as order_id,
    user_id as customer_id,
    order_date,
    status

    from {{ source('jaffle_shop', 'orders') }}
    1. Создайте файл models/core/fct_orders.sql для построения факт‑таблицы с данными о клиентах и заказах.
    models/core/fct_orders.sql
    with customers as (
    select *
    from {{ ref('stg_customers') }}
    ),

    orders as (
    select *
    from {{ ref('stg_orders') }}
    ),

    customer_orders as (
    select
    customer_id,
    min(order_date) as first_order_date
    from orders
    group by customer_id
    ),

    final as (
    select
    o.order_id,
    o.order_date,
    o.status,
    c.customer_id,
    c.first_name,
    c.last_name,
    co.first_order_date,
    -- Note that we've used a macro for this so that the appropriate DATEDIFF syntax is used for each respective data platform
    {{ datediff('first_order_date', 'order_date', 'day') }} as days_as_customer_at_purchase
    from orders o
    left join customers c using (customer_id)
    left join customer_orders co using (customer_id)
    )

    select * from final
    1. Перейдите в Command bar и выполните dbt build.

    Прежде чем downstream‑команда сможет использовать ассеты из этого базового проекта, необходимо:

    • Создать и определить как минимум одну модель с доступом “public”
    • Успешно выполнить deployment‑задание
      • Обратите внимание: включите переключатель Generate docs on run для этого задания, чтобы обновить Catalog. После выполнения вы сможете открыть Explore в верхнем меню и увидеть lineage, тесты и документацию.

    Определение публичной модели и запуск первого задания

    В предыдущем разделе вы подготовили базовые строительные блоки, теперь интегрируем Mesh.

    Хотя команде Finance требуется модель fct_orders для анализа платежных трендов, другие модели — особенно staging‑слой, используемый для очистки и объединения данных — downstream‑командам не нужны.

    Чтобы сделать fct_orders публично доступной:

    1. В файле models/core/core.yml добавьте параметр access: public для нужной модели, вставив и сохранив следующее:
    models/core/core.yml

    models:
    - name: fct_orders
    config:
    access: public # changed to config in v1.10
    description: "Customer and order details"
    columns:
    - name: order_id
    data_type: number
    description: ""

    - name: order_date
    data_type: date
    description: ""

    - name: status
    data_type: varchar
    description: "Indicates the status of the order"

    - name: customer_id
    data_type: number
    description: ""

    - name: first_name
    data_type: varchar
    description: ""

    - name: last_name
    data_type: varchar
    description: ""

    - name: first_order_date
    data_type: date
    description: ""

    - name: days_as_customer_at_purchase
    data_type: number
    description: "Days between this purchase and customer's first purchase"

    Примечание: по умолчанию доступ моделей установлен как “protected”, что означает, что на них можно ссылаться только внутри того же проекта. Подробнее о типах доступа и группах моделей читайте здесь.

    1. Перейдите во вкладку Lineage в Studio IDE, чтобы увидеть модель, помеченную как Public, под ее именем.
    Lineage проекта Jaffle | Data AnalyticsLineage проекта Jaffle | Data Analytics
    1. Перейдите в Version control и нажмите Commit and Sync, чтобы закоммитить изменения.
    2. Слейте изменения в основную или production‑ветку.

    Создание и запуск dbt‑задания

    Прежде чем downstream‑команда сможет использовать ассеты из этого базового проекта, необходимо создать production‑окружение и успешно выполнить deployment‑задание.

    Чтобы запустить первое deployment‑задание dbt, создайте новое задание:

    1. Перейдите в Orchestration > Jobs.
    2. Нажмите Create job, затем Deploy job.
    3. Выберите опцию Generate docs on run, чтобы наполнить метаданные в Catalog.
    Выберите опцию 'Generate docs on run' при настройке dbt‑задания.Выберите опцию 'Generate docs on run' при настройке dbt‑задания.
    1. Нажмите Save.
    2. Нажмите Run now, чтобы запустить задание.
    3. После завершения перейдите в Catalog. Теперь вы должны видеть lineage, тесты и документацию.

    Подробнее о том, как dbt использует метаданные из Staging‑окружения для разрешения ссылок в downstream‑проектах, читайте в разделе Staging with downstream dependencies.

    Ссылка на публичную модель в downstream‑проекте

    В этом разделе вы настроите downstream‑проект “Jaffle | Finance” и выполните межпроектную ссылку на модель fct_orders из базового проекта. Перейдите на страницу Develop, чтобы настроить проект:

    1. Если вы также начали с нового git‑репозитория, нажмите Initialize dbt project в разделе Version control.
    2. Удалите папку models/example.
    3. Перейдите к файлу dbt_project.yml и переименуйте проект (строка 5) с my_new_project на finance.
    4. В файле dbt_project.yml удалите строки 39–42 (ссылку на модель my_new_project).
    5. В File Catalog наведите курсор на директорию проекта, нажмите ... и выберите Create file.
    6. Назовите файл dependencies.yml.
    7. Добавьте upstream‑проект analytics и пакет dbt_utils. Нажмите Save.
    dependencies.yml

    packages:
    - package: dbt-labs/dbt_utils
    version: 1.1.1

    projects:
    - name: analytics

    Staging‑слой

    Теперь, когда базовый проект настроен, начнем создавать дата‑ассеты. Настройте staging‑слой следующим образом:

    1. Создайте новый файл свойств models/staging/sources.yml и объявите источники, скопировав следующий код и нажав Save.
    models/staging/sources.yml

    sources:
    - name: stripe
    database: raw
    schema: stripe
    tables:
    - name: payment
    1. Создайте models/staging/stg_payments.sql, чтобы выбрать данные из таблицы payment источника stripe.
    models/staging/stg_payments.sql

    with payments as (
    select * from {{ source('stripe', 'payment') }}
    ),

    final as (
    select
    id as payment_id,
    orderID as order_id,
    paymentMethod as payment_method,
    amount,
    created as payment_date
    from payments
    )

    select * from final

    Ссылка на публичную модель

    Теперь вы готовы добавить модель, которая анализирует, как типы платежей меняются на протяжении пути клиента. Это помогает определить, уменьшается ли использование купонных подарочных карт при повторных покупках, как ожидает маркетинговая команда, или остается стабильным.

    1. Чтобы сослаться на модель, используйте следующую логику:
    models/core/agg_customer_payment_journey.sql

    with stg_payments as (
    select * from {{ ref('stg_payments') }}
    ),

    fct_orders as (
    select * from {{ ref('analytics', 'fct_orders') }}
    ),

    final as (
    select
    days_as_customer_at_purchase,
    -- we use the pivot macro in the dbt_utils package to create columns that total payments for each method
    {{ dbt_utils.pivot(
    'payment_method',
    dbt_utils.get_column_values(ref('stg_payments'), 'payment_method'),
    agg='sum',
    then_value='amount',
    prefix='total_',
    suffix='_amount'
    ) }},
    sum(amount) as total_amount
    from fct_orders
    left join stg_payments using (order_id)
    group by 1
    )

    select * from final

    1. Обратите внимание, как работает межпроектный ref! При добавлении ref автодополнение в Studio IDE распознает публичную модель как доступную.
    Автодополнение межпроектного ref в Studio IDEАвтодополнение межпроектного ref в Studio IDE
    1. Это автоматически разрешает (связывает) правильные базу данных, схему и таблицу/представление, заданные в upstream‑проекте.
    Компиляция межпроектного refКомпиляция межпроектного ref
    1. Вы также можете увидеть эту связь во вкладке Lineage в реальном времени.
    Lineage межпроектного refLineage межпроектного ref

    Добавление версий моделей и контрактов

    Как повысить устойчивость и добавить защитные механизмы в таких межпроектных связях? Вы можете заимствовать лучшие практики из разработки ПО:

    1. Определение контрактов моделей — настройте model contracts в dbt, чтобы задать набор гарантий, описывающих структуру модели. При сборке dbt проверяет, что результат соответствует контракту; если нет — сборка завершается ошибкой.
    2. Определение версий моделей — используйте model versions для управления обновлениями и систематической обработки breaking‑changes.

    Настройка контрактов моделей

    Как часть команды Data Analytics, вы можете захотеть обеспечить надежность модели fct_orders для downstream‑пользователей, таких как команда Finance.

    1. Перейдите к models/core/core.yml и в описании модели fct_orders перед разделом columns: добавьте контракт данных:
    models:
    - name: fct_orders
    description: “Customer and order details”
    config:
    access: public # changed to config in v1.10
    contract:
    enforced: true
    columns:
    - name: order_id
    .....
    1. Проверьте, что произойдет при нарушении контракта. В models/core/fct_orders.sql закомментируйте колонку orders.status и нажмите Build.
      • При нарушении контракта сборка завершится ошибкой, что видно в истории командной строки.
      Контракт данных нарушен, сборка dbt завершилась ошибкой.Контракт данных нарушен, сборка dbt завершилась ошибкой.

    Настройка версий моделей

    В этом разделе вы настроите версии моделей: команда Data Analytics обновляет модель fct_orders, сохраняя обратную совместимость и уведомляя downstream‑команду Finance о миграции.

    1. Переименуйте существующий файл модели models/core/fct_orders.sql в models/core/fct_orders_v1.sql.

    2. Создайте новый файл models/core/fct_orders_v2.sql и измените схему:

      • Закомментируйте o.status в CTE final.
      • Добавьте новое поле case when o.status = 'returned' then true else false end as is_return, указывающее, был ли заказ возвращен.
    3. Затем добавьте в файл models/core/core.yml:

      • колонку is_return
      • две версии модели
      • latest_version, чтобы указать актуальную версию (используется по умолчанию)
      • deprecation_date для версии 1, чтобы указать дату вывода из эксплуатации.
    4. В итоге файл должен выглядеть так:

    models/core/core.yml


    models:
    - name: fct_orders
    description: "Customer and order details"
    latest_version: 2
    config:
    access: public # changed to config in v1.10
    contract:
    enforced: true
    columns:
    - name: order_id
    data_type: number
    description: ""

    - name: order_date
    data_type: date
    description: ""

    - name: status
    data_type: varchar
    description: "Indicates the status of the order"

    - name: is_return
    data_type: boolean
    description: "Indicates if an order was returned"

    - name: customer_id
    data_type: number
    description: ""

    - name: first_name
    data_type: varchar
    description: ""

    - name: last_name
    data_type: varchar
    description: ""

    - name: first_order_date
    data_type: date
    description: ""

    - name: days_as_customer_at_purchase
    data_type: number
    description: "Days between this purchase and customer's first purchase"

    # Declare the versions, and highlight the diffs
    versions:

    - v: 1
    deprecation_date: 2024-06-30 00:00:00.00+00:00
    columns:
    # This means: use the 'columns' list from above, but exclude is_return
    - include: all
    exclude: [is_return]

    - v: 2
    columns:
    # This means: use the 'columns' list from above, but exclude status
    - include: all
    exclude: [status]
    1. Проверьте, как dbt компилирует ref с учетом обновлений. Откройте новый файл, добавьте следующие запросы и нажмите Compile. Обратите внимание, что каждый ref компилируется в указанную версию (или в последнюю, если версия не указана).
    select * from {{ ref('fct_orders', v=1) }}
    select * from {{ ref('fct_orders', v=2) }}
    select * from {{ ref('fct_orders') }}

    Добавление dbt‑задания в downstream‑проект

    Перед продолжением убедитесь, что вы закоммитили и смержили изменения в обоих проектах — “Jaffle | Data Analytics” и “Jaffle | Finance”.

    Участник команды Finance хочет запланировать задание dbt для анализа пути клиента по платежам сразу после обновления пайплайнов командой аналитики.

    1. В проекте “Jaffle | Finance” перейдите на страницу Jobs через Orchestration > Jobs.
    2. Нажмите Create job, затем Deploy job.
    3. Задайте имя задания и прокрутите вниз до раздела Job completion.
    4. В разделе Triggers настройте Run when another job finishes и выберите upstream‑задание из проекта “Jaffle | Data Analytics”.
    Запуск задания по завершению другого заданияЗапуск задания по завершению другого задания
    1. Нажмите Save и убедитесь, что задание настроено корректно.
    2. Перейдите на страницу заданий “Jaffle | Data Analytics”. Выберите Daily job и нажмите Run now.
    3. После успешного завершения вернитесь на страницу заданий “Jaffle | Finance”. Вы увидите, что задание команды Finance было запущено автоматически.

    Это упрощает синхронизацию с upstream‑таблицами и устраняет необходимость в более сложной оркестрации, например, координации заданий между проектами через внешний оркестратор.

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

    Чтобы узнать, сколько времени у команды Finance есть на миграцию с fct_orders_v1 на fct_orders_v2, выполните следующие шаги:

    1. В проекте “Jaffle | Finance” перейдите на страницу Develop.
    2. Отредактируйте межпроектный ref, указав v=1 в models/marts/agg_customer_payment_journey.sql:
    models/core/agg_customer_payment_journey.sql

    with stg_payments as (
    select * from {{ ref('stg_payments') }}
    ),

    fct_orders as (
    select * from {{ ref('analytics', 'fct_orders', v=1) }}
    ),

    final as (
    select
    days_as_customer_at_purchase,
    -- we use the pivot macro in the dbt_utils package to create columns that total payments for each method
    {{ dbt_utils.pivot(
    'payment_method',
    dbt_utils.get_column_values(ref('stg_payments'), 'payment_method'),
    agg='sum',
    then_value='amount',
    prefix='total_',
    suffix='_amount'
    ) }},
    sum(amount) as total_amount
    from fct_orders
    left join stg_payments using (order_id)
    group by 1
    )

    select * from final
    1. В Studio IDE перейдите в Version control, чтобы закоммитить и смержить изменения.
    2. Перейдите в Deploy, затем на страницу Jobs.
    3. Нажмите Run now, чтобы запустить задание Finance. Модель agg_customer_payment_journey будет собрана, и вы увидите предупреждение о дате вывода версии из эксплуатации.
    Модель отображает предупреждение о дате вывода версии из эксплуатации.Модель отображает предупреждение о дате вывода версии из эксплуатации.

    Просмотр lineage с помощью dbt Catalog

    Используйте Catalog, чтобы просмотреть lineage между проектами в dbt. Перейдите на страницу Explore каждого проекта — теперь вы увидите lineage, непрерывно связанный между проектами.

    Просмотр lineage проекта 'Jaffle | Data Analytics' в dbt CatalogПросмотр lineage проекта 'Jaffle | Data Analytics' в dbt Catalog

    Что дальше

    Поздравляем 🎉! Вы готовы внедрять преимущества Mesh в вашей организации. Вы узнали:

    • Как создать базовый проект “Jaffle | Data Analytics”
    • Как создать downstream‑проект “Jaffle | Finance”
    • Как реализовать доступ к моделям, версии и контракты
    • Как настроить задания dbt, запускаемые после завершения upstream‑заданий

    Вот несколько дополнительных ресурсов, которые помогут продолжить путь:

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

    0