Learning Platform
Глоссарий Troubleshooting
Урок 17.01 · 30 мин
Средний
capstoneproject-overviewproduction-readyduckdbchecklist

Capstone: project overview

Welcome to the capstone. Это финальный проект курса dbt II, который связывает все 15 предыдущих модулей в одно production-grade приложение. Объём — 12-15 часов вашего времени, в результате — портфолио-проект, который можно показывать на интервью.

В этом уроке — обзор: что строим, зачем именно так, какие требования, как будем проверять “готово”.

dbt-iii: что дальше после этого capstone

Что мы строим

E-commerce analytics pipeline для гипотетического интернет-магазина “GrandShop”. Это типичный workload, который вы встретите в любой product analytics команде. Бизнес-контекст:

  • Магазин продаёт ~50k SKU
  • ~10k orders в день, growing
  • 5 sources: orders DB (Postgres), events stream (Kafka -> S3 -> DuckDB), product catalog (Postgres), users DB (Postgres), marketing events (CSV exports)
  • Stakeholders: CEO/CFO (revenue dashboards), product team (conversion analytics), marketing (campaign attribution), customer support (order lookup)

Что мы построим: 30+ dbt-моделей в medallion-структуре, semantic layer для 3 ключевых метрик, CI/CD с Slim CI, документация, exposures для downstream-систем.


Технологический стек

ComponentChoiceОбоснование
WarehouseDuckDB (через dbt-duckdb 1.10)Локально, без cloud, без credentials. Производственно использовался бы Snowflake / BigQuery — но архитектурные паттерны те же.
dbtdbt-core 1.10Текущий stable. Все фичи курса работают: microbatch, snapshots с hard_deletes, semantic_models, model contracts.
CI/CDGitHub ActionsОткрытый, бесплатный, де-факто стандарт. Slim CI через state:modified+ + defer.
Pre-commitsqlfluff + dbt-checkpointLocal quality gate перед PR.
Packagesdbt_utils, dbt_expectations, codegenСтандартный набор production-проекта.
Data orchestrationNone для DuckDB capstoneВ реальности это были бы Airflow / Dagster / Cloud Jobs.
WARNING

DuckDB caveats для capstone. dbt-duckdb 1.10 имеет ограничения относительно Snowflake / BigQuery:

  • Microbatch incremental — частично поддержан, на простых случаях работает
  • Snapshot hard_deletes invalidate_hard_deletes — workaround через post-hook
  • Materialized views — не поддерживаются
  • Iceberg — не нативно, через extensions

В реальности на production вы бы использовали Snowflake (полный feature parity) или BigQuery. Но архитектурно проект одинаков. Где DuckDB не справляется — мы честно скажем “в prod-warehouse это работало бы так, у нас workaround или пропускаем”.


Архитектура pipeline: medallion + marts

Capstone pipeline: data flow
sources5 sources: orders_db, events_stream, products_db, users_db, marketing_csv. Seeded в DuckDB для capstone.
staging (8 моделей)stg_orders, stg_order_items, stg_events, stg_products, stg_users, stg_marketing_events, stg_user_addresses, stg_payment_methods. 1:1 renaming + type casting + light filtering
intermediate (10 моделей)int_orders_enriched, int_users_with_first_order, int_events_session, int_products_with_categories, int_marketing_attribution, int_returns_processed, int_payment_authorized, int_users_lifetime, int_orders_grouped, int_session_funnel
marts (8 моделей)mart_orders, mart_revenue_daily, mart_users_360, mart_products_performance, mart_campaigns_attribution, mart_conversion_funnel, mart_return_rate, mart_payment_summary. Production-grade с contracts
snapshots (3)customers_snapshot, products_snapshot, prices_snapshot — SCD2 для slowly-changing dimensions
semantic models (3)revenue, conversion_rate, cumulative_revenue — для BI tools через Semantic Layer
exposures (5)executive_dashboard, marketing_attribution_report, ml_churn_model, customer_support_lookup, finance_close_pack

Итого: 8 staging + 10 intermediate + 8 marts + 3 snapshots = 29 моделей. Плюс tests, semantic models, exposures, docs.


Production-ready чек-лист

Это критерии, по которым проверяем “готово”. Каждый пункт — обязательный.

Архитектура и структура

  • Папочная структура: models/staging/{source}/, models/intermediate/{domain}/, models/marts/{domain}/
  • Naming convention: stg_<source>__<entity>, int_<domain>__<purpose>, <grain>_<entity> для marts
  • Каждая папка имеет _models.yml и _sources.yml (где применимо)
  • dbt_project.yml валиден, profile настроен на DuckDB
  • packages.yml с dbt_utils, dbt_expectations

Sources и freshness

  • Все 5 sources задекларированы в _sources.yml
  • Freshness rules на критичных sources (orders, events)
  • Source-уровневые тесты: not_null на primary keys

Models: materializations

  • Staging: materialized='view' (default для staging)
  • Intermediate: materialized='ephemeral' или view (по обстоятельствам)
  • Marts: materialized='table' для большинства, incremental для большой fact (orders)
  • mart_revenue_daily — incremental с merge strategy
  • mart_orders — incremental с insert_overwrite strategy (или microbatch на простых случаях)

Snapshots

  • customers_snapshot с timestamp strategy
  • products_snapshot с check strategy
  • prices_snapshot с timestamp + invalidate_hard_deletes (или workaround на DuckDB)
  • dbt_valid_to_current configured

Tests

  • Стандартные тесты: not_null, unique, accepted_values, relationships на ключевых колонках всех marts
  • dbt-expectations: 5+ продвинутых тестов (expect_column_values_to_be_between, expect_table_row_count_to_be_between)
  • Custom generic test: 1+ (например, test_revenue_consistency)
  • Unit tests: 3+ unit tests на критичные модели (например, int_marketing_attribution)
  • Severity: error для critical, warn для quality checks
  • store_failures: true на 3+ ключевых тестах для debugging

Model contracts и versions

  • 3+ marts с enforced contracts (mart_revenue_daily, mart_users_360, mart_orders)
  • 1 mart с versions: mart_revenue_daily имеет v1 и v2

Documentation

  • Все marts описаны в yml: description + column descriptions
  • Используется doc block для повторяющихся описаний
  • dbt docs generate работает без ошибок
  • persist_docs: { relation: true, columns: true } для marts

Semantic Layer

  • 3 semantic_models:
    • revenue — simple metric (SUM revenue)
    • conversion_rate — ratio metric (orders / sessions)
    • cumulative_revenue — cumulative metric (running total)
  • Saved queries для типичных BI views

Exposures

  • 5 exposures: executive_dashboard, marketing_attribution_report, ml_churn_model, customer_support_lookup, finance_close_pack
  • У каждого exposure указан owner

CI/CD

  • GitHub Actions workflow в .github/workflows/dbt-ci.yml
  • Workflow запускается на pull_request
  • Slim CI: dbt build --select state:modified+ --defer --state ./prod_state
  • Prod state хранится как GitHub artifact или в S3 (мы используем artifact)
  • Source freshness check в CI
  • Pre-commit hooks: sqlfluff + dbt-checkpoint в .pre-commit-config.yaml

Quality

  • dbt build (полный) зелёный: все models успешно построены, все tests passed
  • dbt compile без warnings
  • sqlfluff lint passing на всём проекте
  • README.md с описанием проекта и how-to-run

Структура проекта в репозитории

dbt-capstone-ecommerce/
├── README.md
├── dbt_project.yml
├── packages.yml
├── profiles.yml.example
├── .pre-commit-config.yaml
├── .github/
│   └── workflows/
│       └── dbt-ci.yml
├── seeds/
│   ├── raw_users.csv
│   ├── raw_orders.csv
│   ├── raw_order_items.csv
│   ├── raw_products.csv
│   ├── raw_events.csv
│   └── raw_marketing_events.csv
├── models/
│   ├── staging/
│   │   ├── orders_db/
│   │   │   ├── _sources.yml
│   │   │   ├── _models.yml
│   │   │   ├── stg_orders_db__orders.sql
│   │   │   ├── stg_orders_db__order_items.sql
│   │   │   ├── stg_orders_db__payments.sql
│   │   │   └── stg_orders_db__addresses.sql
│   │   ├── events/
│   │   │   ├── _sources.yml
│   │   │   ├── _models.yml
│   │   │   └── stg_events__page_views.sql
│   │   ├── products_db/
│   │   ├── users_db/
│   │   └── marketing/
│   ├── intermediate/
│   │   ├── orders/
│   │   ├── users/
│   │   ├── marketing/
│   │   └── events/
│   ├── marts/
│   │   ├── core/
│   │   │   ├── _models.yml
│   │   │   ├── mart_orders.sql
│   │   │   ├── mart_revenue_daily.sql
│   │   │   ├── mart_revenue_daily_v2.sql
│   │   │   └── mart_users_360.sql
│   │   ├── marketing/
│   │   ├── product/
│   │   └── finance/
│   └── _exposures.yml
├── snapshots/
│   ├── customers_snapshot.yml
│   ├── products_snapshot.sql
│   └── prices_snapshot.yml
├── tests/
│   ├── generic/
│   │   └── test_revenue_consistency.sql
│   └── singular/
│       └── orders_total_matches_items.sql
├── unit_tests/
│   ├── int_marketing_attribution_unit.yml
│   ├── mart_orders_unit.yml
│   └── mart_revenue_daily_unit.yml
├── macros/
│   ├── generate_schema_name.sql
│   ├── get_date_dim.sql
│   └── custom_test_macros.sql
└── semantic_models/
    ├── revenue.yml
    ├── conversion_rate.yml
    └── cumulative_revenue.yml

Это полная структура. Можно начинать с пустого репо и заполнять по шагам в следующих уроках.


Тайминг работы

Capstone не делается за вечер. Реалистичный план — 5 сессий по 2-3 часа:

СессияОбъём работыФокус
1 (3 часа)Setup + sources + 8 staging моделейdbt-duckdb настроен, seeds загружены, staging работает
2 (3 часа)10 intermediate + 5 marts (without contracts)Базовый DAG зелёный, все ref’ы работают
3 (2.5 часа)Incremental + snapshots + 3 contractsProduction-grade marts (mart_orders incremental, snapshots SCD2)
4 (2.5 часа)Tests (data + unit) + dbt-expectations + custom genericПолное покрытие тестами
5 (3 часа)Semantic Layer + exposures + CI + docs + READMEФинал: CI зелёный, semantic_models работают

Итого ~14 часов. Реалистично растянуть на 2 недели с темпом 2 вечера + 1 weekend.


Эволюция от course-проекта Jaffle Shop

Jaffle Shop — учебный dbt-проект из официальной документации. Capstone — это его production-эволюция:

Jaffle Shop (tutorial)Capstone (production-grade)
5 моделей29 моделей
Только staging + martsstaging + intermediate + marts + snapshots
Только not_null/unique tests+ dbt-expectations + unit tests + custom generic
Materialization = view + table+ incremental + ephemeral + snapshots
Нет documentation+ persist_docs + doc blocks
Нет CI+ GitHub Actions Slim CI + pre-commit
Нет semantic layer+ 3 semantic_models
Нет contracts+ 3 enforced contracts
Нет exposures+ 5 exposures

Capstone закрывает разрыв между туториалом и реальным продакшном.


Что middle-инженер должен унести

После capstone у вас в портфолио будет:

  • Полный production-grade dbt-проект на 30+ моделях
  • Опыт всех ключевых фич dbt 1.10+: incremental, microbatch, snapshots, unit tests, contracts, versions, semantic_models
  • Рабочий CI/CD pipeline на GitHub Actions
  • Документация и exposures
  • Понимание trade-offs DuckDB vs Snowflake/BigQuery

На интервью это даёт proof of work. Вместо “я учил dbt” — “у меня в репо production-grade проект, могу показать”.


Попробуй сам (setup для следующих уроков)

Прежде чем переходить к уроку 2, подготовьте окружение:

  1. Создайте новый git-репозиторий dbt-capstone-ecommerce.
  2. Установите dbt-duckdb:
    python -m venv venv
    source venv/bin/activate
    pip install dbt-duckdb==1.10.0
  3. Инициализируйте dbt-проект:
    dbt init dbt_capstone_ecommerce
    # выберите duckdb adapter
  4. Настройте profiles.yml на DuckDB:
    dbt_capstone_ecommerce:
      outputs:
        dev:
          type: duckdb
          path: 'capstone.duckdb'
          threads: 4
        prod:
          type: duckdb
          path: 'capstone_prod.duckdb'
          threads: 4
      target: dev
  5. Проверьте: dbt debug должен показать OK.

В уроке 2 начнём грузить seeds и писать staging-модели.


Проверка знанийKnowledge check
В чём принципиальная разница между tutorial-проектом (типа Jaffle Shop, 5 моделей) и production-grade capstone (29 моделей)? Какие 5 ключевых элементов production-ready пропущены в типичных туториалах?
ОтветAnswer
Принципиальная разница не в количестве моделей, а в **operational maturity**. Tutorial показывает "как работает dbt" на учебных примерах. Production-grade показывает, как dbt живёт в реальной команде с реальными pipelines. 5 ключевых элементов, обычно пропущенных в туториалах: (1) Layered architecture с intermediate-слоем. Туториал часто прыгает staging -> marts, что плохо масштабируется. Intermediate — это где живёт business logic, переиспользуемая между разными marts. (2) Incremental materializations и snapshots для real-world data growth. Production-проект не может позволить полный rebuild каждый раз. (3) CI/CD с Slim CI и defer. Без него команда не может работать параллельно — каждый PR ломает другому. (4) Тесты с разной severity: error для critical, warn для quality. Unit tests для бизнес-логики, data tests для shape. dbt-expectations для продвинутых тестов. (5) Documentation + exposures + ownership. Не "когда-нибудь напишем", а часть pipeline — exposures декларируют downstream системы, persist_docs синхронизирует с warehouse, ownership через meta. Дополнительно: contracts, semantic layer, pre-commit hooks, environment management. Capstone — это шаг от "понимаю dbt" к "могу вести production".

Проверьте понимание

Результат: 0 из 0
Аналитический
Вопрос 1 из 6. В чём принципиальная разница между tutorial-проектом (Jaffle Shop, 5 моделей) и capstone production-grade pipeline (30+ моделей)? Какие 5 элементов production-ready пропущены в типичных туториалах?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 4