diff --git a/docs/handbook/README.md b/docs/handbook/README.md index 331612d..2e32aee 100644 --- a/docs/handbook/README.md +++ b/docs/handbook/README.md @@ -4,9 +4,11 @@ и попадают в отчеты. В главах есть короткие примеры, которые можно выполнить на запущенном стенде перед переходом к учебным заданиям. -## Как читать +## Порядок чтения -Читайте главы в порядке ниже. Незнакомые термины можно найти в +Сначала запустите стенд по [инструкции](../../README.md#быстрый-старт). +Затем читайте главы по порядку и выполняйте примеры из них. +Незнакомые термины можно найти в [словаре понятий](../../CONTEXT.md), а подробности устройства — в [технических справочниках](../architecture/). К ним достаточно обращаться по мере необходимости. После путеводителя переходите к @@ -19,27 +21,27 @@ Gitea показывает HTML как текст. Откройте файл и или скачайте его кнопкой «Raw» и откройте в браузере. Сверяйтесь с картой при чтении главы «Хранилище и его слои». -## Главы +## Содержание ### [Хранилище и его слои](storage-layers.md) Как меняются данные при переходе из Kafka в слои STG, ODS, DDS и DM. В конце главы вы посмотрите события, сессии и выручку с помощью SQL. -### [Потоки Airflow и даги модельного времени](airflow-dags.md) +### [Генерация и обработка данных в Airflow](airflow-dags.md) Какие даги создают новые данные, а какие обрабатывают их в хранилище. -Вы запустите генерацию и обработку за день и посмотрите результат в витринах. +Вы сравните содержимое витрин до и после обработки нового дня. -### [Мониторинг: куда смотреть](monitoring.md) +### [Мониторинг в Grafana](monitoring.md) Что показывают панели Grafana и как меняются их показания, пока в стенд -поступают события и заказы. +поступают события и заказы. Вы увидите, почему заказы обновляются реже событий. -### [Немного Superset](superset.md) +### [Отчеты в Superset](superset.md) -Как Superset строит графики по витринам и что происходит с вашими отчетами -при перезапуске стенда. +Как Superset строит графики по витринам. Вы сравните числа на готовом графике +с результатом SQL и узнаете, какие отчеты сохраняются при перезапуске стенда. ### [Генератор: откуда берутся данные](generator.md) diff --git a/docs/handbook/airflow-dags.md b/docs/handbook/airflow-dags.md index e21bdc9..a338c89 100644 --- a/docs/handbook/airflow-dags.md +++ b/docs/handbook/airflow-dags.md @@ -1,19 +1,20 @@ -# Потоки Airflow и даги модельного времени +# Генерация и обработка данных в Airflow Airflow управляет генерацией данных и их обработкой в хранилище. Это разные этапы: сначала в Kafka поступают события и заказы за день работы магазина, затем по ним рассчитываются данные DDS и витрины DM. +Даг описывает задачи Airflow и порядок их выполнения. ```mermaid flowchart LR world_initialize --> etl_pipeline world_live_day --> etl_pipeline - manual[запуск рукой] --> etl_pipeline + manual[ручной запуск] --> etl_pipeline etl_pipeline --> dds_transform --> dm_transform --> dq_check world_next_day --> sources[источники без ETL] ``` -## Два потока входят по-разному +## Загрузка событий и заказов События поступают в топик `hits` и обрабатываются по мере поступления: материализованные представления переносят строки из STG в ODS без участия @@ -24,7 +25,7 @@ Airflow. Даг `orders_ingest` загружает ее целиком. Такой способ приема называется [пакетным](../../CONTEXT.md). -## Даги мира +## Генерация модельных дней В документации миром называется учебный магазин с его посетителями, товарами и заказами. Время в нем идет отдельно от календарного. @@ -54,7 +55,7 @@ Airflow. номер дня остается прежним. Подробности — в [справочнике генератора и модельного времени](../architecture/world.md#даги-модельного-времени). -## Дневной конвейер +## Обработка данных в хранилище Даг `etl_pipeline` по очереди запускает `dds_transform`, `dm_transform` и `dq_check`, дожидаясь завершения каждого. Они рассчитывают данные DDS, @@ -84,20 +85,21 @@ Airflow. проверок описан в [разделе «Звено DQ конвейера»](../architecture/dm.md#звено-dq-конвейера). -## Как найти в интерфейсе +## Поиск дагов в Airflow Даги мира ищите по тегам «модельное время» и «жизненный цикл мира». Остальные даги ищите по тегам «заказы», `etl`, `dds`, `dm` и `dq`. `homework_check` с тегами `dm` и `labs` проверяет домашние работы; о нем рассказано в учебных заданиях. -## Посмотрите сами +## Один день от генерации до витрин Откройте Airflow по адресу из раздела [«Адреса и пароли»](../../README.md#адреса-и-пароли). В Admin → Variables найдите -`world_position`. Затем запустите `world_next_day` на один день по [инструкции -из README](../../README.md#добавить-данные-за-следующие-дни). Убедитесь, что +`world_position` и запомните его значение. Затем запустите `world_next_day` +на один день по [инструкции из README](../../README.md#добавить-данные-за-следующие-дни). Убедитесь, что `orders_ingest` завершился успешно, а в витринах нового дня еще нет. +Значение `world_position` должно увеличиться на один. Запустите `etl_pipeline` вручную и дождитесь его завершения. В DBeaver, подключенном по @@ -121,8 +123,8 @@ LIMIT 3; приходит слепок за день D−1. Выручка дня D появится после генерации дня D+1 и запуска конвейера. -## Куда дальше +## Следующая глава и справочники Детали — в справочниках [конвейера](../architecture/etl.md) и -[мира](../architecture/world.md). Следующая глава — [«Мониторинг: куда -смотреть»](monitoring.md). +[мира](../architecture/world.md). Следующая глава — +[«Мониторинг в Grafana»](monitoring.md). diff --git a/docs/handbook/generator.md b/docs/handbook/generator.md index aadf9ac..409e28e 100644 --- a/docs/handbook/generator.md +++ b/docs/handbook/generator.md @@ -5,7 +5,7 @@ магазина раз в модельные сутки выгружает состояние заказов в топик `orders`. Эта дневная выгрузка называется слепком. -## Что он производит +## События сайта и заказы Событие содержит сведения о действии посетителя: например, время, адрес страницы и идентификатор посетителя. Формат соответствует образцу @@ -20,11 +20,11 @@ разобраны в [отдельном справочнике](../architecture/orders/snapshot.md). -## Почему данные всегда одни и те же +## Почему начальные данные повторяются Случайные решения генератора зависят от заданного числа — [зерна генерации](../architecture/generator/seeds.md) — и номера дня. -При неизменных настройках и версии генератора одинаковые зерно и день +При неизменных коде, каталоге товаров и настройках одинаковые зерно и день дают одинаковые события. Поэтому при создании стенда вы каждый раз получаете те же начальные данные. Повторный `make up` на работающем стенде сохраняет уже загруженные данные. @@ -34,10 +34,10 @@ В документации этот файл называется паспортом мира. С ним можно сверить результат генерации и проверить, все ли события загрузились в ODS. -## Кто его запускает +## Запуск генератора На стенде генератором управляют [даги модельного -времени](airflow-dags.md#даги-мира). Его можно запустить и напрямую. Команды +времени](airflow-dags.md#генерация-модельных-дней). Его можно запустить и напрямую. Команды собраны в [справочнике генератора и модельного времени](../architecture/world.md#как-запустить-генератор). @@ -45,7 +45,7 @@ В живом режиме события поступают постепенно, как в работающем магазине, но время идет ускоренно: модельные сутки занимают около 24 минут. -## Посмотрите сами +## Сверка с паспортом мира Подключитесь из DBeaver по [инструкции](../../README.md#подключиться-из-dbeaver) и выполните запрос: @@ -62,7 +62,7 @@ ORDER BY EventDate; Числа должны совпасть. Если вы уже генерировали следующие дни, в результате запроса будут дополнительные даты; в паспорте их нет. -## Куда дальше +## Учебные задания и справочники Подробнее генератор разобран в [README папки `generator/`](../../generator/README.md) и в [справочнике его diff --git a/docs/handbook/monitoring.md b/docs/handbook/monitoring.md index 4b0be44..e47cd82 100644 --- a/docs/handbook/monitoring.md +++ b/docs/handbook/monitoring.md @@ -1,20 +1,19 @@ -# Мониторинг: куда смотреть +# Мониторинг в Grafana -В Grafana настроены три дашборда. «Данные» показывает загрузку и обработку -событий и заказов, «Кластер» — состояние узлов и самого ClickHouse, -а «Запросы» — выполненные запросы и затраченные на них ресурсы. +В Grafana настроены три дашборда — экрана с показателями и графиками. +«Данные» показывает загрузку и обработку событий и заказов, +«Кластер» — состояние узлов и самого ClickHouse, а «Запросы» — выполненные +запросы и затраченные на них ресурсы. -Prometheus собирает метрики с двух узлов ClickHouse, ClickHouse Keeper -и экспортера Kafka — службы, которая предоставляет метрики Kafka. -Grafana получает данные из Prometheus и напрямую из ClickHouse. На панелях не заданы пороги для цветовых предупреждений: оценивать показания вы будете самостоятельно. Качество данных автоматически проверяет даг `dq_check`. ## Дашборд «Данные» -«Свежесть» показывает, сколько времени прошло с последнего события и с -последнего заказа в ODS. Показатель для заказов растет весь модельный день +«Свежесть» показывает, сколько реального времени прошло с поступления +последних успешно разобранных событий и заказов. Время поступления хранится +в колонке `_load_ts` слоя ODS. Показатель для заказов растет весь модельный день и снижается, когда поступает очередная дневная выгрузка — слепок. Это ожидаемо: заказы загружаются раз в день. @@ -33,7 +32,11 @@ STG: по нему видно, поступила ли очередная выг Источники и правила чтения всех панелей разобраны в [справочнике дашборда «Данные»](../architecture/monitoring/data.md). -## Почему у панелей разные источники +## Источники показателей + +Grafana получает данные напрямую из ClickHouse и через Prometheus. +Prometheus собирает метрики с двух узлов ClickHouse, ClickHouse Keeper +и экспортера Kafka — службы, которая предоставляет метрики Kafka. Свежесть считается по ODS: если новые сообщения перестали разбираться, показатель будет расти. Число поступивших сообщений берется из STG, @@ -45,7 +48,7 @@ STG: по нему видно, поступила ли очередная выг всех доставленных сообщений. Подробности — в [разделе о слоях панелей](../architecture/monitoring/data.md#почему-слои-у-панелей-разные). -## Два других дашборда +## Состояние кластера и запросы Открывайте «Кластер», чтобы проверить нагрузку на процессор, использование памяти и дисков, число частей таблиц и ход их слияний в ClickHouse. Здесь же @@ -58,11 +61,11 @@ STG: по нему видно, поступила ли очередная выг [справочник дашборда «Запросы»](../architecture/monitoring/queries.md). -## Посмотрите сами +## Показатели за один модельный день Откройте Grafana по адресу из раздела [«Адреса и пароли»](../../README.md#адреса-и-пароли), затем дашборд «Данные». Запустите в -Airflow [`world_live_day`](airflow-dags.md#даги-мира): модельный день займет +Airflow [`world_live_day`](airflow-dags.md#генерация-модельных-дней): модельный день займет около двадцати четырех минут. Смотрите свежесть событий и свежесть заказов по отдельности. Пока день идет, @@ -73,11 +76,11 @@ Airflow [`world_live_day`](airflow-dags.md#даги-мира): модельны при генерации следующего дня. Даг пока продолжает работу, ожидая завершения обработки данных в дневном конвейере. -## Куда дальше +## Следующая глава и справочники Устройство мониторинга описано в [техническом справочнике](../architecture/monitoring/README.md), панели дашборда «Данные» — в [отдельном разделе](../architecture/monitoring/data.md). Почему выбраны именно эти показатели, объясняет [ADR 0002](../adr/0002-monitoring-scope.md). Следующая глава — -[«Немного Superset»](superset.md). +[«Отчеты в Superset»](superset.md). diff --git a/docs/handbook/storage-layers.md b/docs/handbook/storage-layers.md index b293734..a62fbd3 100644 --- a/docs/handbook/storage-layers.md +++ b/docs/handbook/storage-layers.md @@ -1,16 +1,17 @@ # Хранилище и его слои -В хранилище приходят два потока из Kafka: в топике `hits` — события -кликстрима, в `orders` — заказы магазина. Оба проходят один путь: STG → ODS → -DDS → DM. В STG сообщения сохраняются как есть, в ODS разбираются по полям, -в DDS из них собираются события, заказы и сессии, а в DM — витрины для отчетов. +В Kafka поступают события сайта, или кликстрим, и заказы магазина. +Для событий выделен топик `hits`, для заказов — `orders`. +Из Kafka данные проходят четыре слоя хранилища. В STG сообщения сохраняются +как есть, в ODS разбираются по полям, в DDS из них собираются события, +заказы и сессии, а в DM — витрины для отчетов. ```mermaid flowchart LR Kafka --> STG --> ODS --> DDS --> DM ``` -## Как читать имена +## Имена таблиц и представлений Для обычного чтения выбирайте представления с суффиксом `_v`. Они позволяют менять устройство таблиц, сохраняя привычные запросы к данным. @@ -20,7 +21,7 @@ flowchart LR Подробный разбор имен есть в [справочнике хранилища](../architecture/storage.md#имена-объектов). -## STG: как поступило +## STG: исходные сообщения STG — сырой слой. Он сохраняет сообщение целой строкой, без разбора. Вместе с ним записываются сведения о доставке: топик, партиция, смещение и время @@ -31,7 +32,7 @@ STG — сырой слой. Он сохраняет сообщение цело удаляются по правилу из [справочника хранилища](../architecture/storage.md#срок-жизни-сырых-данных). -## ODS: язык источника +## ODS: разбор сообщений В ODS содержимое сообщения разбирается на колонки с нужными типами данных: датами, числами, строками. Колонки сохраняют имена из источника. Например, @@ -41,7 +42,7 @@ STG — сырой слой. Он сохраняет сообщение цело `*_errors` вместе с исходной строкой и классом ошибки. Правильно записанные сообщения обрабатываются дальше. -## DDS: язык бизнеса +## DDS: события, заказы и сессии DDS — детальный слой: в нем данные подготовлены для анализа событий, заказов и сессий. Здесь же хранится карта идентичностей — таблица связей @@ -51,6 +52,8 @@ DDS — детальный слой: в нем данные подготовле В стенде визитом, или сессией, считают подряд идущие события одного `ClientID` без пауз дольше 30 минут. Визит не пересекает границу модельных суток. +Модельные сутки — день в календаре учебного магазина. Этот календарь +не зависит от текущей даты на вашем компьютере. Источник передает готовый идентификатор визита `VisitID` по образцу Яндекс Метрики. В учебном хранилище сессии рассчитываются заново по времени @@ -61,7 +64,7 @@ DDS — детальный слой: в нем данные подготовле Готовые сессии читайте через `dds.session_v`. События для самостоятельного расчета доступны в `dds.event_v`: в этом представлении `VisitID` скрыт. -## DM: данные для дашбордов +## DM: витрины для отчетов DM — слой витрин. Витрина — готовый набор показателей для отчета или дашборда. Здесь уже посчитаны, например, дневная выручка по категориям и @@ -71,7 +74,7 @@ DM — слой витрин. Витрина — готовый набор по путь расчета. Состав готовых витрин смотрите в [карте таблиц](../architecture/storage.md#карта-таблиц). -## Справочные данные: зона `dic` +## Справочники в базе `dic` В базе `dic` хранятся готовые справочные данные. Они загружаются отдельно от событий и заказов и могут использоваться в расчетах любого слоя. @@ -81,7 +84,7 @@ DM — слой витрин. Витрина — готовый набор по устроена зона, смотрите в [разделе о справочниках](../architecture/storage.md#справочники). -## Сквозные ключи +## Связь данных между слоями Идентификаторы позволяют связать данные из разных слоев. При переходе в DDS часть колонок переименовывается: например, `WatchID` становится `event_id`. @@ -99,7 +102,7 @@ DM — слой витрин. Витрина — готовый набор по [словарь понятий](../../CONTEXT.md#язык). Точные имена объектов и полей сверяйте с [картой таблиц](../architecture/storage.md#карта-таблиц). -## Посмотрите сами +## Примеры запросов Подключитесь к ClickHouse по инструкции из разделов [«Адреса и пароли»](../../README.md#адреса-и-пароли) и [«Подключиться из @@ -122,6 +125,8 @@ ORDER BY UTCEventTime LIMIT 20; ``` +Каждая строка здесь — отдельное действие посетителя. + Второй запрос покажет 20 сессий того же дня с наибольшим числом событий. Сессии рассчитаны по всем событиям дня: @@ -140,7 +145,12 @@ ORDER BY events_total DESC LIMIT 20; ``` -Третий запрос покажет готовую выручку по категориям за тот же день: +Теперь одна строка представляет целый визит. `events_total` показывает, +сколько событий в него вошло; начало и конец визита записаны в +`started_at` и `finished_at`. + +Третий запрос покажет выручку магазина по категориям за тот же день. +Эта витрина рассчитана по заказам: ```sql SELECT @@ -153,13 +163,13 @@ WHERE report_date = '2026-06-01' ORDER BY revenue DESC; ``` +Здесь одна строка содержит итоги дня для категории товаров. Все три запроса читают представления `_v`. -## Куда дальше +## Следующая глава и справочники Откройте [интерактивную карту](architecture-map.html) из своей копии репозитория и проследите путь данных. Список объектов, сроки хранения и устройство таблиц — в [справочнике хранилища](../architecture/storage.md). Как данные обрабатываются между слоями — в -следующей главе: [потоки Airflow и даги модельного -времени](airflow-dags.md). +следующей главе: [«Генерация и обработка данных в Airflow»](airflow-dags.md). diff --git a/docs/handbook/superset.md b/docs/handbook/superset.md index 79ab674..5ed759e 100644 --- a/docs/handbook/superset.md +++ b/docs/handbook/superset.md @@ -1,4 +1,4 @@ -# Немного Superset +# Отчеты в Superset Superset показывает витрины слоя DM в виде графиков. К ClickHouse он подключается пользователем `bi`. Дашборд стенда «Бизнес-сюжеты» собран из трех @@ -24,7 +24,7 @@ Superset показывает витрины слоя DM в виде графи Затем на основе датасета создается график: выбираются показатели и способ их отображения. Несколько графиков можно разместить на одном дашборде. -## Стендовые объекты и ваши +## Готовые и собственные отчеты Готовые датасеты, графики и дашборд сохранены в файлах репозитория и импортируются при каждом `make up`. Если изменить их через интерфейс, @@ -43,13 +43,14 @@ Superset](../architecture/superset.md#импорт-при-каждой-иниц Последняя дата с выручкой на день раньше последней даты с событиями кликстрима. Выгрузка заказов за день D поступает при генерации следующего дня D+1, а затем обрабатывается конвейером. Вы уже видели эту разницу -в [главе об Airflow](airflow-dags.md#посмотрите-сами). Начальное состояние +в [главе об Airflow](airflow-dags.md#один-день-от-генерации-до-витрин). Начальное состояние показано в разделе [«Стартовый мир»](../architecture/world.md#стартовый-мир). -## Посмотрите сами +## Сверка графика с витриной Откройте Superset по адресу из раздела [«Адреса и пароли»](../../README.md#адреса-и-пароли) и выберите дашборд «Бизнес-сюжеты». +Найдите график «Посетители и известные пользователи». Затем откройте SQL Lab и выполните запрос: ```sql @@ -59,9 +60,14 @@ ORDER BY report_date DESC LIMIT 7; ``` -Как построить свой отчет, рассказывают [учебные задания](../labs/README.md). +Выберите одну дату из результата. На дашборде задайте «Период», в который +она входит, и обновите график. Наведите указатель на точку этой даты: +числа посетителей и известных пользователей должны совпасть с `visitors` +и `known_users` из SQL. -## Куда дальше +Как построить собственный отчет, рассказывают [учебные задания](../labs/README.md). + +## Следующая глава и справочники Подключение и настройка Superset описаны в [справочнике Superset](../architecture/superset.md), а состав витрин — в [справочнике diff --git a/docs/labs/1-2-top-pages-daily.md b/docs/labs/1-2-top-pages-daily.md index 4635c17..6f9fd77 100644 --- a/docs/labs/1-2-top-pages-daily.md +++ b/docs/labs/1-2-top-pages-daily.md @@ -7,7 +7,7 @@ ## Подготовка - [«Хранилище и его слои»](../handbook/storage-layers.md); -- [«Потоки Airflow и даги модельного времени»](../handbook/airflow-dags.md). +- [«Генерация и обработка данных в Airflow»](../handbook/airflow-dags.md). ## Дневные показатели страниц diff --git a/docs/labs/1-3-session-overview.md b/docs/labs/1-3-session-overview.md index 7c0dc24..cc9e91f 100644 --- a/docs/labs/1-3-session-overview.md +++ b/docs/labs/1-3-session-overview.md @@ -7,7 +7,7 @@ ## Подготовка - [«Хранилище и его слои»](../handbook/storage-layers.md); -- [«Потоки Airflow и даги модельного времени»](../handbook/airflow-dags.md). +- [«Генерация и обработка данных в Airflow»](../handbook/airflow-dags.md). ## Показатели визитов diff --git a/docs/labs/1-4-dq-errors-daily.md b/docs/labs/1-4-dq-errors-daily.md index 423c658..695bdc9 100644 --- a/docs/labs/1-4-dq-errors-daily.md +++ b/docs/labs/1-4-dq-errors-daily.md @@ -6,7 +6,7 @@ ## Подготовка - [«Хранилище и его слои»](../handbook/storage-layers.md); -- [«Потоки Airflow и даги модельного времени»](../handbook/airflow-dags.md). +- [«Генерация и обработка данных в Airflow»](../handbook/airflow-dags.md). ## Ошибки загрузки и их источники diff --git a/docs/labs/1-5-utm-effectiveness.md b/docs/labs/1-5-utm-effectiveness.md index 8bbe5cc..d52548a 100644 --- a/docs/labs/1-5-utm-effectiveness.md +++ b/docs/labs/1-5-utm-effectiveness.md @@ -7,7 +7,7 @@ ## Подготовка - [«Хранилище и его слои»](../handbook/storage-layers.md); -- [«Потоки Airflow и даги модельного времени»](../handbook/airflow-dags.md). +- [«Генерация и обработка данных в Airflow»](../handbook/airflow-dags.md). ## Покупки по рекламным каналам diff --git a/docs/labs/2-1-superset-chart.md b/docs/labs/2-1-superset-chart.md index 3d59b54..dcb6f8a 100644 --- a/docs/labs/2-1-superset-chart.md +++ b/docs/labs/2-1-superset-chart.md @@ -5,7 +5,7 @@ ## Подготовка -- [«Немного Superset»](../handbook/superset.md); +- [«Отчеты в Superset»](../handbook/superset.md); - [задание 3: `dm.session_overview`](1-3-session-overview.md). ## График отказов по устройствам @@ -59,7 +59,7 @@ FROM dm.session_overview_v; ``` Стендовые объекты не меняйте. Что переживает `make up`, а что стирает -`make clean`, описано в главе [«Немного Superset»](../handbook/superset.md#стендовые-объекты-и-ваши). +`make clean`, описано в главе [«Отчеты в Superset»](../handbook/superset.md#готовые-и-собственные-отчеты). ## Проверка результата diff --git a/docs/labs/3-1-sessions-by-hand.md b/docs/labs/3-1-sessions-by-hand.md index 4b1da26..5af5726 100644 --- a/docs/labs/3-1-sessions-by-hand.md +++ b/docs/labs/3-1-sessions-by-hand.md @@ -6,7 +6,7 @@ ## Подготовка -- [Хранилище и его слои, раздел DDS](../handbook/storage-layers.md#dds-язык-бизнеса); +- [Хранилище и его слои, раздел DDS](../handbook/storage-layers.md#dds-события-заказы-и-сессии); - [формат события: Идентификаторы и время](../formats/clickstream-event.md#идентификаторы-и-время). ## События и визиты @@ -58,7 +58,7 @@ ORDER BY EventDate, ClientID; для другого пропустили. По списку видно, чьи события нужно исследовать. Расхождений будет всего несколько. Если их нет, мир прожил мало дней. -Прогоните несколько дней через [даги модельного времени](../handbook/airflow-dags.md#даги-мира) +Прогоните несколько дней через [даги модельного времени](../handbook/airflow-dags.md#генерация-модельных-дней) и повторите сверку. ### Поиск причины расхождения diff --git a/generator/README.md b/generator/README.md index 7731615..132d00b 100644 --- a/generator/README.md +++ b/generator/README.md @@ -77,7 +77,7 @@ и через окружение; имена и примеры собраны в [справочнике запуска](../docs/architecture/world.md#как-запустить-генератор). Прямой запуск генератора не продвигает сохраненную позицию времени стенда — -ей управляют [даги модельного времени](../docs/handbook/airflow-dags.md#даги-мира). +ей управляют [даги модельного времени](../docs/handbook/airflow-dags.md#генерация-модельных-дней). Из каталога `generator/` доступны: