feat(airflow): пульт стал world_init, добавлен DAG world_next_day (#4)

- Зачем:
  - список DAG'ов должен читаться лесенкой ddl_init → world_init →
    world_next_day, а путь менти — проходиться пустыми формами
    (issue #4, спека редизайна пути менти, решения 2–3).
- Что:
  - generator_control переименован в world_init, дефолт операции —
    import; next-day ушёл из выпадашки в отдельный DAG;
  - новый беспараметрный world_next_day: расписание */30 * * * *,
    создаётся на паузе, catchup=False, max_active_runs=1; общие
    задачи вынесены в airflow/dags/utils/startup_history_tasks.py;
  - доки и контрактные тесты обновлены синхронно; быстрый старт
    README — без make ddl, схему создаёт DAG ddl_init.
- Проверка:
  - make test (210 + 31) и make lint зелёные;
  - живая приёмка на чистом стенде: world_init пустой формой
    импортировал эталонный мир за 217 с (3 дня, 280 437 событий),
    world_next_day после снятия с паузы добавляет ровно один день
    за прогон, дашборд Superset собирается.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 21:45:02 +03:00
co-authored by Claude Fable 5
parent 76ff669cf7
commit ac7a973504
12 changed files with 268 additions and 192 deletions
+19 -10
View File
@@ -9,7 +9,7 @@
витринами.
Поток данных коротко:
- **стартовая история**: `generator backfill → Kafka → ClickHouse (STG) →
- **стартовая история**: `world_init → Kafka → ClickHouse (STG) →
batch STG → ODS → DDS → DM → Superset`.
- **живое продолжение**: `generator live → Kafka → ClickHouse (STG) → batch ETL
→ Superset`.
@@ -31,20 +31,29 @@
Перед первой командой нужны `Docker` с `docker compose`, `make`, `bash`, `curl`,
`git` и `uv`. `uv` нужен для локальных Python-проверок и команд разработки.
Для ручной работы поднимите стенд и создайте стартовую историю через Airflow:
Для ручной работы поднимите стенд:
```bash
make up
make ddl
docker compose ps
```
Откройте Airflow: `http://localhost:8080` (`admin/admin`). Сначала снимите
паузу с DAG `etl_pipeline` (переключатель слева от имени): на свежем стенде он
создаётся на паузе, и `backfill` откажется стартовать. Затем запустите
`generator_control` с операцией `backfill`: DAG создаст стартовую историю,
запустит ETL и выполнит `check`. `make up` не запускает live-генератор; live
включается отдельно командой `make generator-continue`.
Дальше всё делается в Airflow: `http://localhost:8080` (`admin/admin`).
Список DAG'ов читается лесенкой сверху вниз; на свежем стенде все DAG'и
создаются на паузе, поэтому перед запуском снимайте паузу переключателем
слева от имени.
1. `ddl_init` — снимите паузу и запустите: DAG создаст схему ClickHouse
(отдельная команда в терминале не нужна).
2. `etl_pipeline` — только снимите паузу: его запустит следующий шаг.
3. `world_init` — снимите паузу и запустите с пустой формой: DAG импортирует
эталонный мир, запустит ETL и сверит витрины.
4. `world_next_day` — когда захотите добавить ровно один модельный день,
запустите его с пустой формой. Расписание задано каждые 30 минут, но по
умолчанию DAG стоит на паузе.
`make up` не запускает live-генератор; live включается отдельно командой
`make generator-continue`.
После обновления репозитория снова выполните `make up`: команда пересобирает
Airflow-образ и подтягивает новые зависимости и DAG-и. Superset-дэшборд
@@ -53,7 +62,7 @@ Airflow-образ и подтягивает новые зависимости
Для полностью автоматического чистого прогона из консоли есть команда — это
тот же путь, что выше через Airflow UI, но одной командой и без ручных шагов
(DDL она применяет сама, отдельный `make ddl` не нужен):
(схему ClickHouse она применяет сама):
```bash
make generated-history-analytics