docs(course): переведены уроки на стартовую историю
- Зачем: - учебный путь должен идти через генерацию и штатный пайплайн, а не через архивный сид. - Что: - обновлены уроки 00-06 и стандарт урока под startup-history/backfill. - объяснено, что data/*.jsonl остаются кладовкой значений генератора. - тест-план переведён на новый штатный запуск и HITL-приёмку. - Проверка: - rg -n \"make clean/up/ddl/data/transform|make data|kafka_load|LIMIT=|2022-11-28|26 из 50\" docs/course docs/TEST_PLAN.md. - git diff --cached --check.
This commit is contained in:
@@ -63,42 +63,28 @@ DM-витрина — это SQL-объект в ClickHouse. Она задаёт
|
||||
|
||||
## 2. Руки: запускаем Superset и смотрим дашборд
|
||||
|
||||
Подними стенд и прогони полный демо-датасет:
|
||||
Подними стенд и создай стартовую историю. Это штатный путь курса: готовый источник
|
||||
данных стенда пишет события в Kafka, ClickHouse читает их в STG, затем batch строит
|
||||
ODS, DDS, DM и обновляет Superset. Файлы `data/*.jsonl` пока остаются только кладовкой
|
||||
значений для этого источника, а не источником аналитического контура.
|
||||
|
||||
```bash
|
||||
make generated-history-analytics
|
||||
make up
|
||||
make ddl
|
||||
make data
|
||||
make transform
|
||||
```
|
||||
|
||||
`make transform` прогоняет цепочку STG → ODS → DDS → DM вне Airflow. Для этого урока так
|
||||
быстрее: нам нужен готовый DM-слой, а не разбор DAG. Отладочный срез через
|
||||
`LIMIT=50 make data` можно использовать для быстрых экспериментов, но эталонный dashboard
|
||||
и числа урока рассчитаны на полном наборе данных.
|
||||
|
||||
Теперь инициализируй Superset:
|
||||
|
||||
```bash
|
||||
make superset-init
|
||||
```
|
||||
|
||||
Эта команда создаёт или обновляет:
|
||||
Команда уже прогоняет цепочку STG → ODS → DDS → DM и создаёт metadata Superset:
|
||||
|
||||
- подключение `clickhouse_dwh`;
|
||||
- 6 datasets поверх `dm.*`.
|
||||
|
||||
После этого создай или обнови charts и сам dashboard:
|
||||
|
||||
```bash
|
||||
make superset-dashboard
|
||||
```
|
||||
|
||||
Эта команда создаёт или обновляет:
|
||||
|
||||
- 10 charts;
|
||||
- dashboard `E-commerce Analytics Dashboard`.
|
||||
|
||||
Для этого урока нам нужен готовый DM-слой и уже созданный dashboard, а не разбор DAG.
|
||||
Если Superset metadata нужно пересоздать отдельно, используй `make superset-init`.
|
||||
Если нужно обновить только charts и dashboard после правки в `superset/create_dashboard.py`,
|
||||
используй `make superset-dashboard`.
|
||||
|
||||
Открой Superset: `http://localhost:8088` (логин `admin`, пароль `admin`).
|
||||
|
||||
Если Superset предлагает сменить пароль после первого входа, для учебного стенда можно нажать
|
||||
@@ -133,33 +119,33 @@ http://localhost:8088/superset/dashboard/ecommerce-analytics/
|
||||
> **Зерно (grain), он же уровень гранулярности — это что считается одной строкой
|
||||
> таблицы.** У события зерно
|
||||
> «одно событие = одна строка» (ключ `event_id`), у визита — «один визит = одна
|
||||
> строка» (ключ `click_id`). Это разные зёрна: событий 1000, а визитов 99, потому
|
||||
> что в одном визите много событий. Складывать строки разного зерна в одно число
|
||||
> бессмысленно — это всё равно что сложить «штуки яблок» и «корзины яблок».
|
||||
> строка» (ключ `click_id`). Это разные зёрна: событий обычно больше, чем визитов,
|
||||
> потому что в одном визите много событий. Складывать строки разного зерна в одно
|
||||
> число бессмысленно — это всё равно что сложить «штуки яблок» и «корзины яблок».
|
||||
|
||||
Поэтому чарт держит **одно зерно — event**: берёт по одной канонической таблице
|
||||
событий на слой (`browser_raw → browser_event → event → v_events_enriched`), а не сумму
|
||||
по слою. Если просуммировать все таблицы слоя, в один столбец попадут таблицы разного
|
||||
зерна (события 1000 + визиты 99 + пустые error-таблицы) и получится «воронка потерь»,
|
||||
которой на самом деле нет.
|
||||
зерна: события, визиты и технические таблицы ошибок. Получится «воронка потерь», которой
|
||||
на самом деле нет.
|
||||
|
||||
Шаг **1050 → 1000** на первом переходе — это не потеря данных, а дедупликация
|
||||
at-least-once потока по `event_id` в ODS (`ReplacingMergeTree`): в STG приехало 1050 строк,
|
||||
но уникальных `event_id` среди них — 1000 (часть событий Kafka доставила повторно). Дальше
|
||||
число стабильно. Настоящие проблемы качества (ошибки парсинга, осиротевшие события) на
|
||||
чистых демо-данных равны нулю и лежат в `dm.dq_summary` отдельными `check_name` — их
|
||||
разбирали уроки 3–4.
|
||||
Если на первом переходе число уменьшается, это не обязательно потеря данных. В ODS работает
|
||||
дедупликация at-least-once потока по `event_id` (`ReplacingMergeTree`): в STG могут приехать
|
||||
повторы, а дальше остаётся каноническое число уникальных событий. Настоящие проблемы качества
|
||||
(ошибки парсинга, осиротевшие события) на чистой стартовой истории равны нулю и лежат в
|
||||
`dm.dq_summary` отдельными `check_name` — их разбирали уроки 3–4.
|
||||
|
||||
### Фильтр даты
|
||||
|
||||
В демо-данных события датированы `2022-11-28`. В текущей конфигурации dashboard фильтр даты
|
||||
открывается как `No filter`. Если у тебя осталась старая metadata Superset и native filter
|
||||
**Date Range** стоит в значении `Last week`, часть графиков может быть пустой, хотя данные есть.
|
||||
В стартовой истории события идут по модельному времени стенда. В текущей конфигурации
|
||||
dashboard фильтр даты открывается как `No filter`. Если у тебя осталась старая metadata
|
||||
Superset и native filter **Date Range** стоит в значении `Last week`, часть графиков может
|
||||
быть пустой, хотя данные есть.
|
||||
|
||||
Для этого урока поставь в фильтре даты одно из двух:
|
||||
|
||||
- `No filter`;
|
||||
- или ручной диапазон вокруг `2022-11-28`.
|
||||
- или ручной диапазон вокруг дат, которые видны в `event_timestamp`.
|
||||
|
||||
После этого нажми **Apply filters**. Теперь смотри на dashboard как аналитик: какие графики
|
||||
отвечают на бизнес-вопросы, а какие только показывают техническое устройство конвейера.
|
||||
@@ -415,7 +401,7 @@ metadata Superset.
|
||||
| `make superset-init` | Superset → **Settings → Database Connections** | есть подключение `clickhouse_dwh` |
|
||||
| открыть **Datasets** | Superset UI | есть datasets `v_events_enriched`, `v_top_pages_daily`, `dq_summary` |
|
||||
| открыть dashboard | Superset UI | видны KPI, маркетинг, география и прохождение строк по слоям |
|
||||
| поставить **Date Range → No filter** | dashboard filters | графики не скрываются из-за даты `2022-11-28` |
|
||||
| поставить **Date Range → No filter** | dashboard filters | графики не скрываются из-за даты модельного времени |
|
||||
| поменять `row_limit` у `Page Funnel` на `3` и запустить `make superset-dashboard` | chart `Page Funnel` | не больше трёх страниц |
|
||||
| вернуть `row_limit` на `20` и запустить `make superset-dashboard` | chart `Page Funnel` | ограничение снова до 20 страниц |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user