Этот стенд можно использовать самостоятельно, но он также является курсовой работой плана обучения Data Engineering Roadmap. Нужна помощь? Обратитесь к автору материалов — ментору @dementev_dev.
Учебный стенд для лабораторных по Data Engineering: Airflow оркестрирует загрузку данных из демо‑БД bookings (Postgres) в Greenplum.
Основная цель стенда — дать вам удобное место для лабораторных работ и будущей курсовой: вы построите небольшое аналитическое хранилище данных (DWH) на базе Greenplum и закрепите навыки:
- моделирования данных (слои DWH, модели, витрины);
- построения ETL/ELT;
- работы с Airflow и Greenplum.
В курсовой у нас один источник данных — демо‑БД bookings. В стенде уже есть готовые учебные примеры загрузки bookings → STG → ODS → DDS → DM в Greenplum, чтобы вы могли сфокусироваться на DWH‑части и не тратить время на инфраструктуру.
- 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.
- Скопируйте настройки:
cp .env.example .env- Поднимите стенд:
make up
# если make не установлен: docker compose up -d- Инициализируйте демо‑БД bookings:
make bookings-init # быстрое восстановление из seed-дампа (~18 сек), рекомендуется
# make bookings-generate # альтернатива: полная генерация с нуля (занимает часы)- Подготовьте объекты DWH в Greenplum (выберите один вариант):
- Учебный вариант: в Airflow UI запустите DAG'и по порядку —
bookings_stg_ddl,bookings_ods_ddl,bookings_dds_ddl,bookings_dm_ddl; - Технический шорткат:
make ddl-gp(применяет DDL для STG, ODS, DDS и DM разом).
- Запустите DAG'и загрузки данных по порядку:
bookings_to_gp_stage— загрузка в STGbookings_to_gp_ods— загрузка в ODSbookings_to_gp_dds— загрузка в DDSbookings_to_gp_dm— загрузка в DM (витрины)
- Проверьте результат в Greenplum:
make gp-psql
-- внутри psql:
SELECT COUNT(*) FROM stg.bookings;
SELECT COUNT(*) FROM ods.bookings;
SELECT COUNT(*) FROM dds.dim_airports;
SELECT COUNT(*) FROM dds.fact_flight_sales;
SELECT COUNT(*) FROM dm.sales_report;
-- Остальные DDS/DM-таблицы пока пусты — вы реализуете их в задании.Подробнее про логику DAG и проверки — docs/bookings_to_gp_stage.md.
- Приступайте к заданию:
Стенд работает, данные загружены. Переходите к учебным заданиям — там описан путь от изучения эталона до полной реализации DWH.
Основные (для потока 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‑проверки.bookings_dm_ddl— создаёт/обновляет DM-витрины (sales_report, route_performance, passenger_loyalty, airport_traffic, monthly_overview).bookings_to_gp_dm— загружает данные из DDS в DM (агрегированные витрины).
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+DM к Greenplum вручную (вместо DDL-DAG)
make down # остановить и удалить контейнеры/сети (volumes сохраняются)
make clean # полный reset: удалить контейнеры/сети и volumes (данные будут потеряны)Перед подключением убедитесь, что стенд поднят (make up).
Host:localhostPort: значениеGP_HOST_PORTиз.env(по умолчанию5435)Database: значениеGP_DBиз.env(по умолчаниюgp_dwh)Username: значениеGP_USER(по умолчаниюgpadmin)Password: значениеGP_PASSWORD(по умолчаниюgpadmin)
Host:localhostPort: значениеBOOKINGS_DB_PORTиз.env(по умолчанию5434)Database:demoUsername: значениеBOOKINGS_DB_USER(по умолчаниюbookings)Password: значениеBOOKINGS_DB_PASSWORD(по умолчаниюbookings)
- Учебные задания
- План тестирования/проверок и негативные кейсы
- Дополнительные заметки и технические детали
- Детали по STG DAG
- Детали по ODS DAG
- Детали по DDS DAG
- Детали по DM DAG
| Проблема | Решение |
|---|---|
| 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=1 (синхронная генерация). При BOOKINGS_JOBS>1 генерация идёт параллельно через dblink. |
| Ошибка подключения к 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).