Зачем: владелец прочел главы и нашел неестественные фразы: дашборды «спрашивают», даги «двигают ось», заказ «ездит в слепках», Superset — «витрины глазами», объекты «приезжают из файлов». Читателю такие образы надо расшифровывать, а урок в них не прячется. Что: в четырех главах олицетворения заменены прямыми формулировками, «позиция мира» и «шаговый даг» раскрыты через world_position и имена дагов, паспорт мира описан по составу и назначению, окно слепка заказов объяснено словами, режимы генератора и правило импорта Superset сказаны прямо. Тире и стрелки оставлены: это домашний стиль. Проверка: проверки тикета #220 на битые ссылки и запретные слова пусты, строки прозы не длиннее 80 знаков, git diff --check чист. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
6.9 KiB
Потоки Airflow и даги модельного времени
В Airflow два рода дагов. Даги мира создают мир и проигрывают модельные дни, а дневной конвейер раскладывает сыгранный день по слоям хранилища.
flowchart LR
world_initialize --> etl_pipeline
world_live_day --> etl_pipeline
manual[запуск рукой] --> etl_pipeline
etl_pipeline --> dds_transform --> dm_transform --> dq_check
world_next_day --> sources[источники без ETL]
Два потока входят по-разному
События приходят в топик hits. Хранилище разбирает их само и непрерывно:
материализованные представления переносят строки из STG в ODS без участия
Airflow.
Заказы приходят в топик orders один раз в модельные сутки, целым слепком. У
слепка есть начало и конец, поэтому даг orders_ingest забирает его одной
порцией. Такой способ приема называется пакетным.
Даги мира
Два дага с тегом «жизненный цикл мира» отвечают за стартовый мир:
| Даг | Что делает |
|---|---|
world_initialize |
Создает стартовый мир, если его еще нет |
world_recreate |
Стирает данные мира и собирает стартовый мир заново |
Три дага с тегом «модельное время» проигрывают следующие дни. Именно их называют дагами модельного времени.
| Даг | Что делает |
|---|---|
world_next_day |
Играет следующие дни пачкой |
world_live_day |
Играет следующий день в темпе модельного времени |
world_live |
Запускает живые дни один за другим, пока снят с паузы |
Сколько дней уже сыграно, стенд помнит в переменной Airflow world_position:
в ней лежит номер первого несыгранного дня. world_next_day и world_live_day
записывают новое значение только после успешно сыгранного дня; оборванный
прогон его не меняет.
Сыграв день D, эти два дага отправляют слепок заказов за день D−1 и ждут, пока
orders_ingest его примет. Эти связи разобраны в справочнике
мира.
Дневной конвейер
У etl_pipeline нет своей обработки. Он по очереди запускает dds_transform,
dm_transform и dq_check и ждет каждый даг. Параметров у него нет: сколько
дней обработать, он сам определяет по world_position и по тому, что уже лежит
в слоях. Поэтому один и тот же запуск верен и когда его запустил другой даг, и
когда вы нажали кнопку, и когда его повторяют после сбоя. Детали есть в
справочнике конвейера.
world_next_day не запускает конвейер. После него слои хранилища отстают от
мира, пока вы не запустите конвейер сами. world_live_day, наоборот,
запускает etl_pipeline и ждет его. Поэтому даг остается в работе и после
конца модельного дня.
Что значит красный
Красный etl_pipeline не отменяет сыгранного дня: world_position уже
записана. Достаточно перезапустить конвейер рукой; разбираться, на чем
остановился прошлый прогон, не нужно. Кто запускает конвейер, описано в
разделе о трех путях запуска.
Качество данных проверяет контур DQ. В дневном конвейере это даг dq_check:
упавшая задача печатает в лог ключи строк, не прошедших проверку. Состав
проверок описан в разделе «Звено DQ
конвейера».
Как найти в интерфейсе
Даги мира ищите по тегам «модельное время» и «жизненный цикл мира». Остальные
даги ищите по тегам «заказы», etl, dds, dm и dq. homework_check с
тегами dm и labs проверяет домашние работы; о нем рассказано в учебных
заданиях.
Посмотрите сами
Откройте Airflow по адресу из раздела «Адреса и
пароли». В Admin → Variables найдите
world_position. Затем запустите world_next_day на один день по инструкции
из README. Убедитесь, что orders_ingest
отработал, а витрины еще ничего не получили. Запустите etl_pipeline рукой.
В DBeaver, подключенном по инструкции, выполните два запроса:
SELECT report_date, visitors, known_users
FROM dm.daily_traffic_v
ORDER BY report_date DESC
LIMIT 3;
SELECT report_date, sum(revenue) AS revenue
FROM dm.revenue_daily_v
GROUP BY report_date
ORDER BY report_date DESC
LIMIT 3;
В трафике уже есть сыгранный день, а в выручке только предыдущий: вместе с этим днем пришел слепок заказов за предыдущий. Выручка сыгранного дня появится после следующего.
Куда дальше
Детали — в справочниках конвейера и мира. Следующая глава — «Мониторинг: куда смотреть».