Files
ddadminandClaude Opus 4.8 cbf8b2d770 fix(course): правки по итогам слепого ревью лаб 07/08 (#22)
Зачем: два слепых ревью (Codex CODE-1..9, Claude TASK-1..2) и
перепроверки нашли дефекты в лабах и метадоках; финал лабы 08
переделан по решению пользователя.

Что:
- канонический сброс в README курса теперь снимает DAG'и с паузы
  (все создаются на паузе);
- имя дашборда исправлено на «E-commerce Analytics Dashboard»;
- финал лабы 08: вместо мифа «users == sessions на статике» —
  вернувшийся пользователь через границу заморозки и измеренное
  обещание свежести; §2 велит записать границы и время (§6 их требует);
- CONTEXT.md: эталонный мир — замороженный живой,
  4 056 пользователей / 26 083 визита, возвраты уже есть;
- уроки 5–6 ведут в обязательный маршрут, живое упражнение
  урока 5 требует канонический сброс;
- контрактные тесты: убран якорь на удалённую команду; добавленные
  на триаже тесты-цитаты срезаны до устойчивых инвариантов
  (прозаический легаси-жанр — issue #24);
- handoff обновлён до текущего состояния.

Проверка: make test (219 generator + 31 contract) и make lint зелёные;
SQL вернувшегося пользователя проверен на эфемерном ClickHouse 25.1
(на полном наборе — в #23).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 14:48:02 +03:00

118 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Курс «Кликстрим на ClickHouse» (со звёздочкой)
Это продвинутый курс «со звёздочкой» для тех, кто уже прошёл базовую программу. Ты
поднимаешь у себя живой стенд (Kafka + ClickHouse + Airflow + мониторинг + BI) и
проходишь по нему основные паттерны инженерии данных. Курс самодостаточный — он
рассчитан на то, что ты идёшь по нему сам: каждый урок объясняет, зачем нужен паттерн,
даёт потрогать его руками и проверить себя в конце.
Курс — блок «со звёздочкой» открытого роадмапа Data Engineer
([de.dementev.space](https://de.dementev.space/), он же
[на GitHub](https://github.com/dementev-dev/de-roadmap)).
> **Пройти можно самому — а можно с ментором.** В одиночку реально — курс для того и
> сделан. С ментором — быстрее, понятнее и чаще с лучшим результатом:
> персональный план под твою ситуацию, разбор затыков на еженедельном созвоне, код-ревью
> твоих правок и проверка, что ты понял тему вглубь, а не просто прокликал. Хочешь так —
> напиши в Telegram [@dementev_dev](https://t.me/dementev_dev).
## Что нужно до старта
- **База пройдена:** SQL, моделирование данных, Python, Git, Docker, Airflow. ClickHouse
знать заранее не нужно — это и есть тема курса.
- **Обзорное видео по Kafka из роадмапа** — посмотри перед уроком 0. Оттуда ты возьмёшь
словарь («топик», «партиция», «offset», «consumer-группа», «lag»), а урок 0 свяжет эти
слова с живым стендом.
- **Железо:** стек тяжёлый — Kafka, ClickHouse, Airflow, Superset, Prometheus и Grafana
поднимаются одновременно. Нужна машина, которая это потянет.
- **Инструменты:** `Docker` с `docker compose`, `make`, `bash`, `curl`, `git` и `uv`.
`uv` нужен для локальных Python-проверок и команд разработки.
## Подготовка и канонический сброс
Первый запуск и возврат к чистому эталонному миру идут одним путём. При первом запуске
пропусти `make clean`; для полного сброса выполни все три шага:
1. Выполни `make clean`. Команда удалит данные стенда и метаданные Superset: сохранённые
в нём настройки и дашборды тоже придётся создать заново.
2. Выполни `make up` и открой Airflow на `http://localhost:8080` (`admin/admin`).
На свежем стенде DAG-и стоят на паузе. Подготовь и запусти их по порядку:
- `ddl_init` — сними паузу и запусти с пустой формой;
- `etl_pipeline` — только сними паузу: его вызовет следующий DAG;
- `world_init` — сними паузу и запусти с пустой формой после успешного
`ddl_init`.
3. Когда `world_init` завершится успешно и витрины DM будут готовы, выполни
`make superset-init`.
Так события из эталонного мира попадут в Kafka, затем в STG, ODS, DDS и DM, а Superset
получит готовые наборы данных и дашборд. Файлы `data/*.jsonl` остаются только кладовкой
готовых значений для генератора (браузеры, страны, устройства, UTM), а не источником
аналитического контура.
Точные параметры и разбор ошибок — в [`docs/OPERATIONS.md`](../OPERATIONS.md).
## Уроки
Проходи по порядку — уроки 0→4 повторяют сам пайплайн (Kafka → STG → ODS → DDS →
оркестрация), а 5 и 6 надстраиваются поверх готовых данных. Лабы 7 и 8 затем
растят эталонный мир двумя способами. В колонке «режим»: **наблюдение** — только
смотрим, **руки** — запускаешь и меняешь сам.
| # | Урок | Режим | О чём |
|---|------|-------|-------|
| 0 | [Вводный по Kafka](./lessons/00_kafka_intro.md) | наблюдение | Ходим по Kafka UI: где лежат события, кто их читает, как Kafka помнит, докуда дочитано |
| 1 | [Kafka → ClickHouse (STG)](./lessons/01_kafka_to_clickhouse.md) | руки | Как сообщение из топика становится строкой ClickHouse через Kafka engine и Materialized View |
| 2 | [STG → ODS: типизация и DQ-split](./lessons/02_stg_to_ods.md) | руки | Приводим сырьё к типам и разводим чистое и битое по разным таблицам |
| 3 | [ODS → DDS: сборка сущностей](./lessons/03_ods_to_dds.md) | руки | Собираем `click` и `event` из кусочков (argMax, JOIN) и встречаем «сирот» |
| 4 | [Оркестрация в Airflow](./lessons/04_airflow_orchestration.md) | руки | Всю цепочку — в один DAG с зависимостями и честным гейтом целостности |
| 5 | [Мониторинг: Prometheus и Grafana](./lessons/05_monitoring.md) | наблюдение + мини-правка | Смотрим систему со стороны; гасим сервис — видим, как краснеет алерт |
| 6 | [BI-витрина в Superset](./lessons/06_superset_bi.md) | руки | Дашборд поверх ClickHouse: KPI, динамика, воронка |
| 7 | [Лаба: следующий день](./lessons/07_lab_next_day.md) | руки | Пакетный инкремент дня и границы времени |
| 8 | [Лаба: живое продолжение](./lessons/08_lab_continue.md) | руки | Живой поток и свежесть данных |
## Как проходить
- **По одному уроку за раз** — ожидаемый темп около дня на урок (уроки короткие и
односоставные: один паттерн на урок).
- **Каждый урок устроен одинаково:** зачем паттерн нужен → что запустить и понаблюдать →
чтение эталонного кода → одна управляемая правка с видимым результатом → самопроверка.
Любая правка завершается шагом **«верни как было»**, чтобы стенд не остался сломанным.
- **Идёшь сам** — опорой служат секции «Проверь себя» в конце каждого урока: по ним
видно, понял ты тему или только пробежал глазами.
- **Идёшь с ментором** — еженедельный созвон покрывает несколько уроков сразу: туда
несёшь затыки и ответы «своими словами» из тех же секций «Проверь себя».
## Проверка чистого маршрута
Перед проверкой уроков 0, 1 и 5 пройди
[канонический сброс](#подготовка-и-канонический-сброс).
Что должен подтвердить человек:
- урок 0: в Kafka UI видны четыре топика событий и понятны служебные топики
генератора;
- урок 1: после запуска `world_next_day` учебная колонка `kafka_msg_ts` не пропадает
и заполняется;
- урок 5: Prometheus targets `clickhouse`, `kafka`, `airflow` находятся в `UP`,
а `Kafka No Messages Produced` трактуется с учётом того, включён живой поток
или стенд работает на импортированной базе.
## Границы
Материалы под конкретного менти (привязка к работодателю, легенда, подготовка к
собесам) в этот репозиторий **не кладём** — репозиторий публичный, приватное живёт
в менторской базе.
---
## Под капотом курса (для автора и любопытных)
Эти документы менти для прохождения не нужны — они объясняют, как курс устроен и почему
именно так. Открывай, если ведёшь курс или хочешь заглянуть в его «исходники».
| Файл | Что это |
|------|---------|
| [`PRD.md`](./PRD.md) | Рамка: зачем курс, цели, аудитория, скоуп, критерии успеха (замороженный документ) |
| [`LEARNING_PLAN.md`](./LEARNING_PLAN.md) | План обучения: карта уроков, маршрут, аудит эталонных путей |
| [`LESSON_STANDARD.md`](./LESSON_STANDARD.md) | Стандарт уроков: шаблон, качество кода, самопроверка — рабочий чеклист при написании |