Первоначальная реализация PXF (не тестировано)

This commit is contained in:
2025-12-09 09:42:52 +03:00
parent 86435c282d
commit e3b0fd9ef9
6 changed files with 55 additions and 0 deletions
+3
View File
@@ -1,3 +1,6 @@
# Общие настройки
TZ=Europe/Moscow
# Airflow Configuration
AIRFLOW_USER=admin
AIRFLOW_PASSWORD=admin
+2
View File
@@ -42,6 +42,8 @@
- `SELECT COUNT(*) FROM public.orders;` — оценка объёма.
- `SELECT * FROM public.orders LIMIT 5;` — визуальная проверка.
- `SELECT order_id FROM public.orders GROUP BY 1 HAVING COUNT(*) > 1;` — поиск дублей.
- (после настройки PXF) `SELECT COUNT(*) FROM public.ext_bookings_bookings;` — проверка чтения из демо-БД bookings через PXF.
- (после настройки PXF) `SELECT * FROM public.ext_bookings_bookings LIMIT 5;` — визуальное сравнение с таблицей `bookings.bookings` в исходной БД.
- Завершить `\q`.
## 6. Негативные сценарии и fallback
+9
View File
@@ -5,6 +5,7 @@ services:
# container_name: gp_pgmeta
env_file: .env
environment:
TZ: ${TZ:-Europe/Moscow}
POSTGRES_USER: ${PG_USER}
POSTGRES_PASSWORD: ${PG_PASSWORD}
POSTGRES_DB: ${PG_DB}
@@ -23,6 +24,7 @@ services:
image: postgres:16
env_file: .env
environment:
TZ: ${TZ:-Europe/Moscow}
POSTGRES_USER: ${BOOKINGS_DB_USER}
POSTGRES_PASSWORD: ${BOOKINGS_DB_PASSWORD}
POSTGRES_DB: ${BOOKINGS_DB_NAME}
@@ -43,15 +45,19 @@ services:
# container_name: gp_single
# hostname: gpdbsne
environment:
TZ: ${TZ:-Europe/Moscow}
GREENPLUM_USER: ${GP_USER:-gpadmin}
GREENPLUM_PASSWORD: ${GP_PASSWORD:-gpadmin}
GREENPLUM_DATABASE_NAME: ${GP_DB:-gpadmin}
GREENPLUM_PXF_ENABLE: "true"
# GP_PORT: ${GP_PORT:-5432}
# Порты: внешний 5432
ports:
- "${GP_PORT}:5432"
volumes:
- ./sql:/sql:ro
- ./pxf/postgresql-42.7.3.jar:/data/pxf/lib/postgresql-jdbc.jar:ro
- ./pxf/servers/bookings-db/jdbc-site.xml:/data/pxf/servers/bookings-db/jdbc-site.xml:ro
- greenplum_data:/data
- airflow_data:/opt/airflow/data
# Простая проверка доступности: psql откликается
@@ -66,6 +72,7 @@ services:
container_name: gp_airflow_web
env_file: .env
environment:
TZ: ${TZ:-Europe/Moscow}
AIRFLOW__CORE__LOAD_EXAMPLES: "False"
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${PG_USER}:${PG_PASSWORD}@pgmeta:5432/${PG_DB}
AIRFLOW__WEBSERVER__SECRET_KEY: ${AIRFLOW__WEBSERVER__SECRET_KEY}
@@ -89,6 +96,7 @@ services:
container_name: gp_airflow_sch
env_file: .env
environment:
TZ: ${TZ:-Europe/Moscow}
AIRFLOW__CORE__LOAD_EXAMPLES: "False"
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${PG_USER}:${PG_PASSWORD}@pgmeta:5432/${PG_DB}
AIRFLOW__WEBSERVER__SECRET_KEY: ${AIRFLOW__WEBSERVER__SECRET_KEY}
@@ -110,6 +118,7 @@ services:
# container_name: gp_airflow_init
env_file: .env
environment:
TZ: ${TZ:-Europe/Moscow}
AIRFLOW__CORE__LOAD_EXAMPLES: "False"
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${PG_USER}:${PG_PASSWORD}@pgmeta:5432/${PG_DB}
AIRFLOW__WEBSERVER__SECRET_KEY: ${AIRFLOW__WEBSERVER__SECRET_KEY}
Binary file not shown.
+31
View File
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
JDBC-конфиг для PXF-сервера bookings-db.
Для учебного стенда используем те же дефолтные креды, что и в .env.example:
BOOKINGS_DB_USER=bookings, BOOKINGS_DB_PASSWORD=bookings.
При изменении этих параметров в .env не забывайте обновить их здесь.
-->
<configuration>
<property>
<name>jdbc.driver</name>
<value>org.postgresql.Driver</value>
</property>
<property>
<name>jdbc.url</name>
<value>jdbc:postgresql://bookings-db:5432/demo</value>
</property>
<property>
<name>jdbc.user</name>
<value>bookings</value>
</property>
<property>
<name>jdbc.password</name>
<value>bookings</value>
</property>
</configuration>
+10
View File
@@ -10,3 +10,13 @@ CREATE TABLE IF NOT EXISTS public.orders (
)
WITH (appendonly=true, orientation=row, compresstype=zlib, compresslevel=1)
DISTRIBUTED BY (order_id);
-- Внешняя таблица для чтения данных из демо-БД bookings через PXF (JDBC).
-- Источник: таблица bookings.bookings в базе demo (Postgres, сервис bookings-db).
CREATE EXTERNAL TABLE IF NOT EXISTS public.ext_bookings_bookings (
book_ref CHAR(6),
book_date TIMESTAMP WITH TIME ZONE,
total_amount NUMERIC(10,2)
)
LOCATION ('pxf://bookings.bookings?PROFILE=JDBC&SERVER=bookings-db')
FORMAT 'CUSTOM' (formatter='pxfwritable_import');