- Зачем: - дизайн-документ описывал устаревший batch-driven подход и не фиксировал паттерн TEMP TABLE, используемый в реализации. - Что: - заменено описание загрузки всех UPSERT-витрин на HWM-инкрементальность через _load_ts. - добавлена секция «Общий паттерн загрузки UPSERT-витрин» с SQL-скелетом и таблицей применимости. - в секции «Учит» каждой витрины добавлены паттерны HWM и TEMP TABLE. - Проверка: - визуальная проверка docs/internal/bookings_dm_design.md.
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 (уже настроен в образе)
- Побочный пример: загрузка данных через pandas/CSV (
csv_to_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
- Подготовьте 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‑проверки.
Вспомогательные (побочный трек с CSV):
orders_base_ddl— создаёт таблицуpublic.ordersдля CSV‑пайплайна;csv_to_greenplum— pandas → CSV → Greenplum (пример загрузки без источника‑БД);csv_to_greenplum_dq— проверки качества данных дляpublic.orders.
Полезные команды
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 и повторите DAG. |
Поддерживается только bookings.jobs=1 или BOOKINGS_JOBS=1 |
В этом учебном стенде поддерживается только синхронный режим генерации. Установите BOOKINGS_JOBS=1 и выполните make bookings-init. |
| Ошибка подключения к 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).