Рабочий GreenPlum

This commit is contained in:
2025-09-18 22:56:02 +03:00
parent cea33ea8d8
commit 9ba57c1696
5 changed files with 62 additions and 32 deletions
+10 -13
View File
@@ -1,22 +1,19 @@
# ==== Compose Environment (.env) ==== # Airflow Configuration
# Airflow metadata DB (Postgres) AIRFLOW_USER=admin
AIRFLOW_PASSWORD=admin
# PostgreSQL (Airflow metadata)
PG_USER=airflow PG_USER=airflow
PG_PASSWORD=airflow PG_PASSWORD=airflow
PG_DB=airflow PG_DB=airflow
# Greenplum access from Airflow # Greenplum Configuration
GP_USER=gpadmin
GP_PASSWORD=gpadmin
GP_DB=gpadmin
GP_HOST=greenplum GP_HOST=greenplum
GP_PORT=5432 GP_PORT=5432
GP_DB=gpadmin
GP_USER=gpadmin
# В большинстве демо-образов TCP доступ настроен без пароля (trust).
# Если потребуется пароль, задай его здесь:
GP_PASSWORD=
# Kafka # Kafka Configuration
KAFKA_BOOTSTRAP=kafka:9092 KAFKA_BOOTSTRAP=kafka:9092
KAFKA_TOPIC=orders KAFKA_TOPIC=orders
# Airflow admin
AIRFLOW_USER=admin
AIRFLOW_PASSWORD=admin
+2 -2
View File
@@ -13,7 +13,7 @@ logs:
docker compose -f docker-compose.yml logs -f airflow-webserver airflow-scheduler docker compose -f docker-compose.yml logs -f airflow-webserver airflow-scheduler
gp-psql: gp-psql:
docker compose -f docker-compose.yml exec greenplum bash -lc "su - gpadmin -c 'psql -p 5432 -d gpadmin'" docker compose -f docker-compose.yml exec greenplum bash -c "su - gpadmin -c '/usr/local/greenplum-db/bin/psql -p 5432 -d gpadmin'"
ddl-gp: ddl-gp:
docker compose -f docker-compose.yml exec greenplum bash -lc "su - gpadmin -c \"psql -d gpadmin -f /sql/ddl_gp.sql\"" docker compose -f docker-compose.yml exec greenplum bash -c "su - gpadmin -c '/usr/local/greenplum-db/bin/psql -d gpadmin -f /sql/ddl_gp.sql'"
+38 -10
View File
@@ -6,22 +6,28 @@
Airflow по‑прежнему использует **Postgres** только как metadata DB (это стандартная и простая схема). Airflow по‑прежнему использует **Postgres** только как metadata DB (это стандартная и простая схема).
## Что внутри ## Что внутри
- **Greenplum** (single node) — `datagrip/greenplum:6.8` (локальный стенд для разработки). - **Greenplum** (single node) — `woblerr/greenplum:6.27.1` (локальный стенд для разработки).
- **Kafka (KRaft, без Zookeeper)** — генерация событий. - **Kafka (KRaft, без Zookeeper)** — генерация событий.
- **Airflow (2.9)** — оркестрация пайплайна, metadata в Postgres. - **Airflow (2.9)** — оркестрация пайплайна, metadata в Postgres.
- **DAG** `kafka_to_greenplum.py` — генерирует данные → пишет в Kafka → читает и грузит в Greenplum. - **DAG** `kafka_to_greenplum.py` — генерирует данные → пишет в Kafka → читает и грузит в Greenplum.
- **DDL** `sql/ddl_gp.sql` — создаёт таблицу `orders` с распределением по `order_id`. - **DDL** `sql/ddl_gp.sql` — создаёт таблицу `orders` с распределением по `order_id`.
> Примечание по версиям и надёжности: образы Greenplum в публичном Docker Hub — комьюнити/сторонние. Я выбрал `datagrip/greenplum:6.8` как популярный и поддерживаемый для локальной разработки. Для продакшен‑подобных тестов зафиксируй digest (SHA256) конкретного тега на Docker Hub и/или собери образ самостоятельно. См. раздел «Пинning и альтернативы» ниже. > Примечание по версиям и надёжности: используется образ `woblerr/greenplum:6.27.1` с поддержкой переменных окружения и fallback значениями. Для продакшен‑подобных тестов зафиксируй digest (SHA256) конкретного тега на Docker Hub.
## Быстрый старт ## Быстрый старт
Установим make под Вашу операционную систему Установим make под Вашу операционную систему
```bash ```bash
sudo apt install -y make sudo apt install -y make
``` ```
Запустим приложение
Настроим переменные окружения
```bash ```bash
cp .env.example .env cp .env.example .env
# При необходимости отредактируйте .env для ваших настроек
```
Запустим приложение
```bash
make up && make airflow-init make up && make airflow-init
make logs # ждем "Listening at: http://0.0.0.0:8080" make logs # ждем "Listening at: http://0.0.0.0:8080"
``` ```
@@ -30,23 +36,45 @@ make logs # ждем "Listening at: http://0.0.0.0:8080"
### Проверка загрузки ### Проверка загрузки
```bash ```bash
make gp-psql # войти в psql к Greenplum # Подключение к Greenplum через внешний psql клиент
-- внутри psql: psql -h localhost -p 5432 -U gpadmin -d gpadmin
# Или через Docker (используя make команду)
make gp-psql
# Или напрямую через Docker
docker compose -f docker-compose.yml exec greenplum bash -c "su - gpadmin -c '/usr/local/greenplum-db/bin/psql -p 5432 -d gpadmin'"
# Внутри psql:
\dt \dt
SELECT count(*) FROM public.orders; SELECT count(*) FROM public.orders;
``` ```
## Файлы ## Файлы
- `docker-compose.gp.yml` — сервисы Greenplum + Kafka + Airflow + Postgres (metadata). - `docker-compose.yml` — сервисы Greenplum + Kafka + Airflow + Postgres (metadata).
- `.env.example` — переменные окружения. - `.env.example` шаблон переменных окружения.
- `.env` — переменные окружения (создается из .env.example).
- `airflow/dags/kafka_to_greenplum.py` — сам DAG. - `airflow/dags/kafka_to_greenplum.py` — сам DAG.
- `sql/ddl_gp.sql` — DDL таблицы в Greenplum. - `sql/ddl_gp.sql` — DDL таблицы в Greenplum.
- `Makefile` — обёртки команд (`up`, `down`, `airflow-init`, `gp-psql`, `ddl-gp`). - `Makefile` — обёртки команд (`up`, `down`, `airflow-init`, `gp-psql`, `ddl-gp`).
## Конфигурация через переменные окружения
Все настройки Greenplum передаются через переменные окружения в файле `.env` с fallback значениями:
- `GP_USER` — пользователь Greenplum (по умолчанию: gpadmin)
- `GP_PASSWORD` — пароль пользователя (по умолчанию: gpadmin)
- `GP_DB` — база данных (по умолчанию: gpadmin)
- `GP_PORT` — порт для подключения (по умолчанию: 5432)
Образ `woblerr/greenplum:6.27.1` использует переменные:
- `GREENPLUM_USER` (маппится на `GP_USER`)
- `GREENPLUM_PASSWORD` (маппится на `GP_PASSWORD`)
- `GREENPLUM_DATABASE_NAME` (маппится на `GP_DB`)
## Пинning и альтернативы ## Пинning и альтернативы
- Зафиксируй digest образа `datagrip/greenplum:6.8` (Docker Hub → Tag → «Copy digest») и замени тег на `@sha256:...` в `docker-compose.gp.yml`. - Зафиксируй digest образа `woblerr/greenplum:6.27.1` (Docker Hub → Tag → «Copy digest») и замени тег на `@sha256:...` в `docker-compose.yml`.
- Альтернативы: репозиторий `woblerr/docker-greenplum` позволяет **собрать свой образ** для GPDB 6/7 (подойдёт, если нужен полный контроль и повторяемость сборки). - Альтернативы: можно использовать другие образы Greenplum или собрать собственный образ для GPDB 6/7.
- Особенность GPDB 6: в нём **нет** `INSERT ... ON CONFLICT`. В DAG используется безопасная для GP6 конструкция `INSERT ... WHERE NOT EXISTS` внутри транзакции. - Особенность GPDB 6: в нём **нет** `INSERT ... ON CONFLICT`. В DAG используется безопасная для GP6 конструкция `INSERT ... WHERE NOT EXISTS` внутри транзакции.
## Ограничения и заметки ## Ограничения и заметки
- Этот стенд — учебный. Для высокой надёжности и производительности Greenplum обычно разворачивают кластерами на нескольких узлах, на裸‑железе/VM с отдельными дисками под сегменты. - Этот стенд — учебный. Для высокой надёжности и производительности Greenplum обычно разворачивают кластерами на нескольких узлах, на裸‑железе/VM с отдельными дисками под сегменты.
+1 -1
View File
@@ -1,3 +1,3 @@
confluent-kafka==2.3.0 confluent-kafka==2.3.0
psycopg2-binary==2.9.9 psycopg2-binary==2.9.9
pandas==2.2.2 pandas==2.1.*
+11 -6
View File
@@ -1,5 +1,3 @@
version: "3.9"
services: services:
# Postgres только для Airflow метаданных # Postgres только для Airflow метаданных
pgmeta: pgmeta:
@@ -21,17 +19,23 @@ services:
retries: 20 retries: 20
greenplum: greenplum:
image: datagrip/greenplum:6.8 image: woblerr/greenplum:6.27.1
# container_name: gp_single # container_name: gp_single
hostname: gpdbsne # hostname: gpdbsne
environment:
GREENPLUM_USER: ${GP_USER:-gpadmin}
GREENPLUM_PASSWORD: ${GP_PASSWORD:-gpadmin}
GREENPLUM_DATABASE_NAME: ${GP_DB:-gpadmin}
# GP_PORT: ${GP_PORT:-5432}
# Порты: внешний 5432 # Порты: внешний 5432
ports: ports:
- "5432:5432" - "${GP_PORT}:5432"
volumes: volumes:
- ./sql:/sql:ro - ./sql:/sql:ro
- greenplum_data:/data
# Простая проверка доступности: psql откликается # Простая проверка доступности: psql откликается
healthcheck: healthcheck:
test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -p 5432 || echo 1"] test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -p 5432 -U ${GP_USER:-gpadmin} -d ${GP_DB:-gpadmin} || echo 1"]
interval: 10s interval: 10s
timeout: 5s timeout: 5s
retries: 30 retries: 30
@@ -143,3 +147,4 @@ services:
volumes: volumes:
pgmeta: pgmeta:
kafka-ui-data: kafka-ui-data:
greenplum_data: