Learning Platform
Глоссарий Troubleshooting
Урок 20.04 · 25 мин
Начальный
deploymentmonitoringnext-stepsreflectionlearning-roadmap

Что значит “задеплоить” pet-project

Деплой pet-project — это не реальный production-деплой в облако. Это возможность запустить твой стек одной командой, чтобы собеседующий мог увидеть всё в работе. На pet-project достаточно docker-compose up.

Что включает “задеплоенный” pet-project:

  1. docker-compose.yml со всеми services.
  2. README.md с инструкцией “как запустить за 60 секунд”.
  3. Демо-данные, которые загружаются автоматически (3 месяца достаточно).
  4. Скриншот / GIF дашборда в README.

Docker Compose — собираем всё

# docker-compose.yml
version: "3.8"

services:
  ingester:
    build:
      context: ./ingest
      dockerfile: Dockerfile
    volumes:
      - ./data:/app/data
      - ./ingest:/app
    environment:
      - PYTHONUNBUFFERED=1
    command: python ingester.py 2024-01

  dbt:
    image: python:3.12-slim
    depends_on:
      ingester:
        condition: service_completed_successfully
    volumes:
      - ./data:/app/data
      - ./dbt:/app/dbt
    working_dir: /app/dbt
    command: >
      bash -c "pip install dbt-duckdb &&
               dbt deps &&
               dbt seed &&
               dbt run &&
               dbt test"

  streamlit:
    build:
      context: ./streamlit
      dockerfile: Dockerfile
    depends_on:
      dbt:
        condition: service_completed_successfully
    ports:
      - "8501:8501"
    volumes:
      - ./data:/app/data
    command: streamlit run app.py --server.address 0.0.0.0

Зависимости через depends_on гарантируют: сначала ingester скачивает и грузит, потом dbt трансформирует, потом streamlit показывает. Если упадёт ingester — dbt не запустится.

# ingest/Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
# streamlit/Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8501

После docker-compose up:

  • Через 1-3 минуты — данные загружены (зависит от download speed).
  • Через 1 минуту — dbt отработал, таблицы готовы.
  • Streamlit доступен на http://localhost:8501.

README — лицо проекта

Хороший README — это то, что отделяет middle-уровневый pet-project от средненького.

# NYC Yellow Taxi Data Pipeline

End-to-end ELT pipeline for NYC Yellow Taxi trip data: ingestion -> DWH -> dbt -> dashboard.

![dashboard](docs/dashboard.png)

## Architecture

![architecture](docs/architecture.png)

## Stack

- **Python 3.12** — ingestion (requests, duckdb)
- **DuckDB** — analytical warehouse
- **dbt 1.7** — transformations (5 staging, 4 marts)
- **Streamlit** — interactive dashboard
- **Docker Compose** — local orchestration

## Quick start

\`\`\`bash
git clone https://github.com/username/nyc-taxi-pipeline
cd nyc-taxi-pipeline
docker-compose up
\`\`\`

Open http://localhost:8501

## Data model

Star schema:
- `fct_trips` — fact (one row = one trip)
- `dim_date`, `dim_location`, `dim_vendor`, `dim_payment_type` — dimensions

## Tests

12 dbt tests covering uniqueness, not-null, business rules (total_amount >= 0,
no future trips, dropoff after pickup), referential integrity.

Run: `dbt test`

## What I learned

- Incremental dbt models with `delete+insert` strategy for monthly partitions
- Idempotent ingestion: DELETE+INSERT по `year_month` обеспечивает безопасный retry
- Dimensional modeling Kimball: star schema, derived measures (trip_duration)
- DuckDB как замена локального Postgres для analytics — на 5x быстрее

## Future improvements

- [ ] Hourly schedule + SLA-алерты поверх daily Airflow DAG
- [ ] GitHub Actions CI с dbt test на PR
- [ ] Observability через OpenLineage + Marquez
- [ ] Streaming ingestion из NYC TLC API (when available)

## License

MIT

Это уже сильный README. Ключевые элементы:

  • Скриншот дашборда в самом верху — это первое, что видят.
  • Architecture diagram — показывает, что ты думаешь о системе.
  • Stack list — рекрутер сканирует за 5 секунд.
  • Quick start — одна команда.
  • What I learned — самая важная секция: показывает зрелость и self-reflection.
  • Future improvements — показывает, что ты понимаешь scope ограничения.

Что добавлять дальше

Капстон — это MVP. Дальше можно расширять по нескольким направлениям:

Airflow DAG basics: обязательный daily DAG капстона, в глубину

Direction 1: Orchestration (hardening)

Обязательный capstone-DAG ты уже собрал в LAB-03 (граф задач, ретраи, MinIO-sensor, backfill, recovery). Это направление — закалить его до production: SLA, alerts, hourly schedule, разнесение задач по worker-ам. Базовый декораторный вариант DAG для справки:

# airflow/dags/nyc_taxi_dag.py
from airflow.decorators import dag, task
from datetime import datetime, timedelta

@dag(
    schedule="@daily",
    start_date=datetime(2024, 1, 1),
    catchup=False,
    default_args={
        "retries": 2,
        "retry_delay": timedelta(minutes=5),
        "retry_exponential_backoff": True
    }
)
def nyc_taxi_pipeline():
    @task
    def ingest(year_month: str):
        from ingest.ingester import ingest
        ingest(year_month)

    @task
    def transform():
        import subprocess
        subprocess.run(["dbt", "run", "--project-dir", "/dbt"], check=True)

    @task
    def test():
        import subprocess
        subprocess.run(["dbt", "test", "--project-dir", "/dbt"], check=True)

    ingest("2024-01") >> transform() >> test()

nyc_taxi_pipeline()

Это даёт: daily schedule, retries, dependency graph, history. Хардненная версия добавляет SLA, alert-каналы и hourly-расписание поверх обязательного capstone-DAG.

Direction 2: CI/CD

GitHub Actions для проверки PR:

# .github/workflows/test.yml
name: dbt test

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: "3.12" }
      - run: pip install dbt-duckdb
      - run: cd dbt && dbt seed && dbt run && dbt test

При каждом PR — автоматическая проверка, что dbt всё ещё работает. Это CI для DE.

Direction 3: Observability

Добавить OpenLineage + Marquez:

# docker-compose.yml — добавление сервиса
marquez:
  image: marquezproject/marquez:latest
  ports:
    - "5000:5000"
    - "5001:5001"
  environment:
    - MARQUEZ_PORT=5000

dbt событиями через dbt-ol wrapper отправляет lineage в Marquez. На http://localhost:3000 — UI с графом зависимостей.

Direction 4: Real-time

Kafka как первый шаг к streaming Direction 4 из капстона

Если хочется streaming-опыта:

  • Kafka — добавь producer, который тащит данные раз в минуту.
  • Consumer — пишет в S3/DuckDB.
  • Spark Structured Streaming — для трансформаций.

Это уже middle-level проект, не junior. Можно сделать как второй pet-project.

Direction 5: ML feature pipeline

Если интересен MLE:

  • Feature engineering на trips (fare per mile, time of day patterns).
  • Feature store (Feast).
  • Простая модель (предсказание fare по pickup/dropoff zones).

Что почитать дальше (книги)

После курса — переходи к глубинным источникам:

  1. “Fundamentals of Data Engineering” (Joe Reis & Matt Housley, 2022) — современный обзор DE. После него ты понимаешь, что куда лежит.

  2. “Designing Data-Intensive Applications” (Martin Kleppmann, 2017) — bible distributed systems. Читать по главам, не от корки.

  3. “The Data Warehouse Toolkit” (Ralph Kimball, 3rd edition) — dimensional modeling. Старая, но фундаментальная.

  4. “SQL Antipatterns” (Bill Karwin) — короткая, мощная книга про SQL-ошибки.

  5. “Database Internals” (Alex Petrov) — как устроены БД изнутри.

Что почитать дальше (курсы и материалы)

Деep-dive курсы на этой платформе:

  • airflow-course — оркестрация production-grade.
  • spark-course — distributed computing.
  • kafka-course — event streaming.
  • dbt-course — глубоко dbt.
  • sql-fundamentals + sql-internals — SQL до железа.
  • kubernetes-course — для будущих DPE.
  • clickhouse-course — для analytics-engineering.
  • debezium-course — CDC.
  • flink-course — streaming-обработка.

Не учи все. Выбери 1-2 по интересам, доведи до конца.

Чек-лист “после капстона”

  • GitHub-репозиторий с README, diagrams, screenshots.
  • Запускается одной командой (docker-compose up).
  • dbt tests проходят.
  • Airflow DAG (обязательно): multi-task dependency graph с настроенными ретраями (retries + retry_delay в default_args).
  • DAG ждёт сырьё через sensor на object store (MinIO S3KeySensor на bucket lake), а не грузит вслепую.
  • Показан backfill-прогон за диапазон дат (airflow dags backfill -s ... -e ... nyc_taxi_pipeline).
  • Продемонстрировано падение задачи и recovery — например, скриншот grid view, где видно retry и зелёная recovered-задача после фикса poison-date.
  • README отвечает на: что это, зачем, как запустить, что узнал.
  • Pet-project упомянут в резюме с конкретными числами.
  • LinkedIn-пост или dev.to-статья — bonus.
  • Готов 5-минутный elevator pitch.

Рефлексия

После капстона задай себе вопросы:

  1. Что было самым сложным? Это и есть точка роста — туда углубляться.
  2. Что было самым приятным? Может быть, это твоё направление (Architecture? Coding? BI?).
  3. Какой следующий pet-project? Не повторяй один и тот же — расширяй breadth.
  4. К чему ты готов на собеседовании? Расскажи pet-project на 5 минут — запиши на видео, посмотри сам.
  5. Какие фундаментальные дыры? SQL? Python? dbt? Возвращайся к этому курсу или deep-dive.
TIP

Главное в капстоне — не финальный код, а процесс. Ты прошёл от пустого README до working pipeline — это и есть DE-experience. Junior-recrumiter ценит этот процесс, а не buzzword-стек. Не сдавайся, если что-то не работает — debug 2 часа, потом загугли, потом спроси в DE-сообществе.

Финальная мысль

Junior DE — это профессия, в которую можно войти за 3-12 месяцев со стороны. Главное — систематичность и руки. Не учи теорию ради теории, делай руками. Этот капстон — твой первый production-style проект. Дальше будет ещё десять.

Удачи в собеседованиях. Если что-то непонятно по курсу — открой GitHub-репозиторий курса, напиши issue, или приходи в Telegram-группу. Сообщество слабее личной мотивации, но сильно ускоряет учёбу.

Попробуй сам

  1. Доделай свой капстон. Опубликуй в GitHub под публичной ссылкой.
  2. Напиши LinkedIn-пост: “Я только что закончил DE Fundamentals Course и build pet-project: …” — со скриншотом и ссылкой. Это начнёт твой professional footprint.
  3. Открой 5 вакансий “Junior Data Engineer” в твоём регионе. Сравни их требования со своим стеком — где гэпы? Это план учёбы на следующие 3 месяца.
Проверка знанийKnowledge check
Ты завершил капстон. Дашборд работает локально, GitHub-репо с README. Что три самых важных следующих шага в следующие 2 недели?
ОтветAnswer
Три приоритета: 1) Полировка pet-project — добавить хороший README со screenshot и architecture diagram, проверить что docker-compose работает с чистого клона, написать 5-минутный elevator pitch который проговариваешь вслух (запиши на видео если поможет). 2) Visibility — выложить пост на LinkedIn с ссылкой и screenshot, опционально на dev.to/Medium статью "Что я узнал, делая pet-project на NYC Taxi". Это даёт первый professional footprint. 3) Подача на вакансии — найти 10-20 целевых Junior DE вакансий, переделать резюме с pet-project секцией, начать подаваться. НЕ ждать перед подачей пока освоишь Spark/Kafka — это убивает momentum. Параллельно делать ежедневную SQL-задачу, готовиться к собеседованиям, готовить STAR-истории. Главное — не задерживаться в "учу ещё" mode, а выходить в реальный рынок.

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

Результат: 0 из 0
Прикладной
Вопрос 1 из 5. Что важнее в README pet-project — список технологий или описание 'что я узнал'?

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

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

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

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