5.7 KiB
5.7 KiB
Мини‑README по учебному DAG bookings_to_gp_stage (черновик)
Внутренний файл, чтобы не забыть договорённости. Перед итоговой сдачей документацию по блоку bookings/STG нужно будет аккуратно собрать и переписать.
1. Что делает DAG
- DAG
bookings_to_gp_stageпоказывает учебный поток:- источник: демо‑БД
bookings-db(Postgres, схемаbookings, таблицаbookings.bookings); - при каждом запуске генерируется один учебный день данных (идемпотентно);
- данные из
bookings.bookingsпереливаются в сырой слойstg.bookingsв Greenplum через PXF‑внешнюю таблицуstg.bookings_ext.
- источник: демо‑БД
- Слой
stgзадуман как «сырой»:- все бизнес‑колонки (
book_ref,book_date,total_amount) хранятся какTEXT; - есть тех.колонки
src_created_at_ts,load_dttm,batch_id.
- все бизнес‑колонки (
Подробный дизайн описан в docs/internal/bookings_stg_design.md.
2. Что нужно, чтобы DAG завёлся
Минимальные предпосылки:
- Стенд поднят:
make up. - Демо‑БД bookings инициализирована:
make bookings-init. - В Greenplum применён DDL (созданы схема
stgи таблицыstg.bookings_ext/stg.bookings):make ddl-gp(используетsql/ddl_gp.sql).
- В Airflow есть коннекты:
greenplum_conn(по умолчанию уже используется в helpers/greenplum.py);bookings_db(Postgres к сервисуbookings-db, если не хочется полагаться на ENV).
3. Последовательность задач в DAG
generate_bookings_day:- проверяет наличие таблицы
bookings.bookings; - смотрит, есть ли строки за
load_date(book_date::date = load_date); - если день уже сгенерирован — ничего не делает (идемпотентность), просто логирует это;
- если нет — запускает генератор через DO‑блок (логика как в
bookings/generate_next_day.sql).
- проверяет наличие таблицы
get_last_loaded_ts_from_gp:- проверяет, что есть таблица
stg.bookings; - берёт
max(src_created_at_ts)как последнюю загруженную метку; - если NULL — значит в STG ещё нет данных, дальше идём в режим
full.
- проверяет, что есть таблица
extract_and_load_increment_via_pxf:- читает данные из
stg.bookings_extи вставляет вstg.bookings; - при
last_loaded_ts is Noneделает полную загрузку (full) — все строки; - при delta берёт только строки с
book_date > last_loaded_tsиbook_date <= load_date + 1 day; - приводит бизнес‑поля к
TEXT, заполняетsrc_created_at_ts,load_dttm,batch_id={{ ds_nodash }}.
- читает данные из
check_row_counts:- пересчитывает количество строк в источнике (
stg.bookings_ext) за текущее окно (full/delta); - сравнивает с количеством строк в
stg.bookingsдля текущегоbatch_id; - если не сходится — падает с понятным сообщением и подсказкой «куда смотреть».
- пересчитывает количество строк в источнике (
finish_summary:- логирует итог выполнения DAG за одно срабатывание.
4. Как этим пользоваться студенту (черновой сценарий)
- Поднять стенд и подготовить источники:
make upmake airflow-initmake bookings-initmake ddl-gp
- Открыть Airflow UI (
http://localhost:8080) и включить DAGbookings_to_gp_stage. - Вызвать
TriggerDAG с конкретной датой (например,2017-01-01→ зависит от стартовой конфигурации демобазы). - Посмотреть:
- в
bookings-db― что появился день с бронированиями; - в Greenplum (
make gp-psql) — данные вstg.bookings:SELECT * FROM stg.bookings LIMIT 10;SELECT src_created_at_ts, load_dttm, batch_id FROM stg.bookings ORDER BY src_created_at_ts DESC LIMIT 10;
- в
- Перезапустить DAG для следующей даты и увидеть, что:
- генерация в
bookings.bookingsидёт по одному дню вперёд; - в
stg.bookingsпоявляются только новые записи (delta).
- генерация в
5. Примечания «на потом»
- Текущая документация по блоку bookings/STG разбросана:
README.md(общий обзор стенда),docs/internal/bookings_tz.md(источник bookings),docs/internal/pxf_bookings.md(PXF),docs/internal/bookings_stg_design.md(дизайн STG),- этот файл (мини‑README по DAG).
- В будущем всё это нужно будет собрать в одну понятную историю для студента:
- отдельный раздел «Учебный пример: bookings → stg → dwh»;
- скриншоты DAG, примеры запросов и типичные ошибки.