- Зачем:
- генерация с нуля занимала часы, boarding_passes были пустыми, данные
пропадали после docker compose down/up.
- Что:
- обновлён demodb до коммита 866e56f, добавлен патч install_connstr_no_hardcode.
- BOOKINGS_INIT_DAYS увеличен до 60, BOOKINGS_JOBS по умолчанию 2.
- добавлен seed-дамп bookings/seed/demo.sql.xz (42 MB, xz вместо 7z).
- make bookings-init восстанавливает из дампа (~18 сек) и применяет GUC из .env.
- make bookings-generate — генерация с нуля для разработчиков.
- generate_next_day.sql: COMMIT после continue(), pg_sleep(3) для jobs>1, synchronous_commit=on + CHECKPOINT.
- bookings-check-jobs: добавлена валидация нечисловых значений BOOKINGS_JOBS.
- bookings-init теперь вызывает bookings-check-jobs как prerequisite.
- синхронизированы внутренние документы (коммит demodb, init_days=60).
- Проверка:
- make bookings-init && make bookings-generate-day BOOKINGS_JOBS=2.
- make test.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
airflow-dwh-gp-lab
Учебный стенд для лабораторных по Data Engineering: Airflow оркестрирует загрузку данных из демо‑БД bookings (Postgres) в Greenplum.
Зачем этот стенд
Основная цель стенда — дать вам удобное место для лабораторных работ и будущей курсовой: вы построите небольшое аналитическое хранилище данных (DWH) на базе Greenplum и закрепите навыки:
- моделирования данных (слои DWH, модели, витрины);
- построения ETL/ELT;
- работы с Airflow и Greenplum.
В курсовой у нас один источник данных — демо‑БД bookings. В стенде уже есть готовые учебные примеры загрузки bookings → stg, stg -> ods и ods -> dds в Greenplum, чтобы вы могли сфокусироваться на DWH‑части (ODS/DDS/DM) и не тратить время на инфраструктуру.
Что внутри
- Airflow (UI: http://localhost:8080, по умолчанию; логин/пароль: admin/admin)
- Greenplum (single‑node для обучения; внешний порт по умолчанию
5435) - bookings-db (Postgres с демо‑БД
demo; внешний порт по умолчанию5434) - PXF как “транспорт” между Postgres и Greenplum (уже настроен в образе)
Требования
Стенд запускается в Docker и поднимает несколько сервисов (Airflow + Greenplum + 2×Postgres), поэтому важны ресурсы и настройки Docker.
| Ресурс | Минимум | Рекомендуем |
|---|---|---|
| CPU | 2 ядра | 4+ ядер |
| RAM | 8 GB | 16 GB |
| Диск | 25–30 GB свободного места | 40+ GB (SSD) |
Работает на Linux, а на Windows — при использовании WSL2.
Потребуется make, Docker (docker) и Docker Compose (docker compose) или Docker Desktop.
Для первого запуска нужен доступ в интернет (скачать образы и зависимости).
Порты 8080, 5433, 5434, 5435 должны быть свободны (или измените их в .env).
Порты настраиваются в .env: AIRFLOW_WEB_PORT, PGMETA_PORT, BOOKINGS_DB_PORT, GP_HOST_PORT.
Про PXF и технические детали стенда: docs/stack.md.
Быстрый старт (основной сценарий: bookings -> stg -> ods -> dds)
- Скопируйте настройки:
cp .env.example .env
- Поднимите стенд:
make up
# если make не установлен: docker compose up -d
- Инициализируйте демо‑БД bookings:
make bookings-init # быстрое восстановление из seed-дампа (~18 сек), рекомендуется
# make bookings-generate # альтернатива: полная генерация с нуля (занимает часы)
- Подготовьте STG/ODS/DDS-объекты в Greenplum (выберите один вариант):
- Учебный вариант: в Airflow UI запустите DAG
bookings_stg_ddl, затемbookings_ods_ddl, затемbookings_dds_ddl; - Технический шорткат:
make ddl-gp(применяет DDL для STG, ODS и DDS разом вручную).
-
Запустите основной DAG
bookings_to_gp_stage. -
Запустите DAG
bookings_to_gp_ods. -
Запустите DAG
bookings_to_gp_dds. -
Проверьте результат в Greenplum:
make gp-psql
-- внутри psql:
SELECT COUNT(*) FROM stg.bookings;
SELECT COUNT(*) FROM stg.tickets;
SELECT * FROM stg.bookings ORDER BY src_created_at_ts DESC LIMIT 10;
SELECT COUNT(*) FROM ods.bookings;
SELECT COUNT(*) FROM ods.tickets;
SELECT COUNT(*) FROM dds.dim_routes;
SELECT COUNT(*) FROM dds.fact_flight_sales;
Подробнее про логику DAG и проверки — docs/bookings_to_gp_stage.md.
DAG-и в стенде
Основные (для потока bookings → DWH):
bookings_stg_ddl— создаёт/обновляет весь STG слой для bookings (9 таблиц: bookings, tickets, airports, airplanes, routes, seats, flights, segments, boarding_passes; включая внешние*_extчерез PXF);bookings_to_gp_stage— генерирует учебный день вbookings-db, затем загружает данные в STG и выполняет DQ‑проверки.bookings_ods_ddl— создаёт/обновляет ODS-таблицы по домену bookings.bookings_to_gp_ods— загружает данные из STG в ODS (SCD1 UPSERT) и выполняет DQ‑проверки.bookings_dds_ddl— создаёт/обновляет DDS-таблицы (dim_*,fact_flight_sales) по домену bookings.bookings_to_gp_dds— загружает данные из ODS в DDS (SCD1/SCD2 + факт) и выполняет DQ‑проверки.
Полезные команды
make up # поднять стек
make logs # логи airflow-webserver и airflow-scheduler
make gp-psql # psql в Greenplum
make bookings-psql # psql в демо-БД bookings (Postgres)
make ddl-gp # применить DDL STG+ODS+DDS к Greenplum вручную (вместо DDL-DAG)
make down # остановить и удалить контейнеры/сети (volumes сохраняются)
make clean # полный reset: удалить контейнеры/сети и volumes (данные будут потеряны)
Подключение через DBeaver (опционально)
Перед подключением убедитесь, что стенд поднят (make up).
Greenplum
Host:localhostPort: значениеGP_HOST_PORTиз.env(по умолчанию5435)Database: значениеGP_DBиз.env(по умолчаниюgp_dwh)Username: значениеGP_USER(по умолчаниюgpadmin)Password: значениеGP_PASSWORD(по умолчаниюgpadmin)
bookings-db (Postgres, демо-БД demo)
Host:localhostPort: значениеBOOKINGS_DB_PORTиз.env(по умолчанию5434)Database:demoUsername: значениеBOOKINGS_DB_USER(по умолчаниюbookings)Password: значениеBOOKINGS_DB_PASSWORD(по умолчаниюbookings)
Документация
- Учебные задания:
educational-tasks.md). - План тестирования/проверок и негативные кейсы:
TESTING.md. - Дополнительные заметки и технические детали:
docs/README.md. - Детали по ODS DAG:
docs/bookings_to_gp_ods.md. - Детали по DDS DAG:
docs/bookings_to_gp_dds.md.
Типичные проблемы и решения
| Проблема | Решение |
|---|---|
| Airflow UI не открывается | Дождитесь сообщения Listening at: http://0.0.0.0:8080 в логах (make logs) |
database "demo" does not exist в bookings‑DAG |
Вы сделали reset с удалением volumes (make clean / docker compose down -v). Запустите make bookings-init (быстрое восстановление из дампа, ~18 сек) и повторите DAG. |
Ошибка bookings.jobs должен быть >= 1 |
Проверьте значение BOOKINGS_JOBS в .env — оно должно быть целым числом >= 1. По умолчанию BOOKINGS_JOBS=2 (параллельная генерация через dblink). При BOOKINGS_JOBS=1 генерация идёт синхронно. |
| Ошибка подключения к Greenplum | Убедитесь, что контейнер greenplum имеет статус healthy (docker compose ps) |
protocol "pxf" does not exist |
Перезапустите greenplum и повторите bookings_stg_ddl/make ddl-gp — расширение pxf создаётся автоматически при старте контейнера. |
DAG bookings_to_gp_stage ругается на отсутствующие таблицы stg |
Запустите bookings_stg_ddl (или выполните make ddl-gp), затем повторите запуск |
| Порты 8080/5433/5434/5435 заняты | Остановите локальные сервисы или измените порты в .env |
Благодарности
- Postgres Pro — за демо‑БД bookings и генератор данных
demodb: https://github.com/postgrespro/demodb (лицензия MIT: https://github.com/postgrespro/demodb/blob/main/LICENSE). - woblerr — за Docker-сборку Greenplum: https://github.com/woblerr/docker-greenplum (образ:
woblerr/greenplum, лицензия MIT: https://github.com/woblerr/docker-greenplum/blob/master/LICENSE).