14 KiB
Временное ТЗ по PXF для чтения данных из bookings (черновик)
Этот файл внутренний, удалить перед итоговой сдачей.
1. Цель и границы
- Минимальная цель: настроить PXF в контейнере Greenplum так, чтобы из базы
bookings(Postgres в сервисеbookings-db) можно было делатьSELECTпо одной внешней таблице в Greenplum. - На этом этапе не делаем загрузку в постоянные таблицы Greenplum, только чтение и ручные smoke‑проверки.
- Изменения в коде/конфигурации пока планируем «на бумаге»; реализацию и правки
docker-compose.yml/SQL/DAG делаем отдельным шагом.
2. Архитектура на уровне контейнеров
bookings-db— Postgres 16, демо‑БДdemoиз репозиторияdemodb(источник). Доступен внутри сети Docker по имениbookings-dbи порту5432.greenplum— контейнерwoblerr/greenplum:6.27.1(GPDB 6, Ubuntu 22.04). В нём уже есть:- Greenplum в режиме singlenode;
- установленный PXF (
/usr/local/pxf,pxf version release-6.10.1); - стартовый скрипт
/start_gpdb.sh, который умеет включать PXF по флагуGREENPLUM_PXF_ENABLE=true.
- Внешний мир (IDE/pytest) подключается к Greenplum по порту
${GP_PORT}с хоста, а кbookings-db— по порту${BOOKINGS_DB_PORT}(см..env).
3. Включение PXF в нашем стенде (дизайн)
Планируемые изменения (позже будут внесены в docker-compose.yml):
- В сервисе
greenplumв секциюenvironmentдобавить:GREENPLUM_PXF_ENABLE: "true".
- При первом старте с этим флагом скрипт
/start_gpdb.shсделает за нас:- инициализацию PXF (
pxf cluster prepare,pxf cluster register,pxf cluster sync); - создание расширения
pxfв базе${GREENPLUM_DATABASE_NAME}(у нас это${GP_DB}, по умолчаниюgpadmin); - запуск
pxf cluster startи привязку остановки/старта PXF к жизненному циклу Greenplum.
- инициализацию PXF (
- База конфигов PXF (
PXF_BASE) будет располагаться в${GREENPLUM_DATA_DIRECTORY}/pxf, в нашем compose — это/data/pxfна томеgreenplum_data.- Важно:
make downсейчас делаетdocker compose down -v, поэтому при полном сбросе томов будут теряться и данные GP, и конфиги PXF (включая JDBC‑драйвер иservers/*).
- Важно:
4. JDBC‑драйвер для Postgres: где и как хранить
Задача: PXF должен уметь ходить по JDBC в bookings-db (Postgres). Для этого нужен PostgreSQL JDBC драйвер (postgresql-*.jar).
Варианты хранения драйвера:
- Коммитить JAR в репозиторий и монтировать в контейнер.
- Плюсы: стенд самодостаточен, не зависит от внешних скачиваний, повторяемость выше (особенно на офлайн‑машинах или при падении зеркал).
- Минусы: лишний бинарник в учебном репо, периодически нужно обновлять версию.
- Скачивать JAR внутрь контейнера один раз вручную и хранить его в томе
greenplum_dataвнутриPXF_BASE/lib.- Плюсы: нет бинарников в Git.
- Минусы: дополнительный шаг для студентов, зависимость от сети, нужно повторять после полного сброса томов.
Для учебного стенда окончательно выбираем вариант (1) — JAR в репозитории:
- В репозитории заводим каталог, например
pxf/илиpxf/jdbc/, и кладём туда файлpostgresql-42.7.3.jar(конкретная версия будет зафиксирована отдельно). - В
docker-compose.yml(на этапе реализации) смонтируем этот JAR внутрь контейнераgreenplumв каталог$PXF_BASE/lib, например:./pxf/postgresql-42.7.3.jar:/data/pxf/lib/postgresql-jdbc.jar:ro.
- PXF по документации поддерживает размещение JDBC‑драйвера в
$PXF_BASE/lib(общий для всех серверов) или в$PXF_BASE/servers/<server>/lib(локальный для сервера). Для простоты используем общий каталог$PXF_BASE/lib. - Для студентов не будет лишних подготовительных шагов: после
make upи инициализации конфигов PXF драйвер уже на месте.
Открытый момент: конкретный путь/имя каталога в репозитории (pxf/, docker/pxf/ и т.п.) и точная версия драйвера будут приняты при переходе к реализации; важно только, что JAR хранится в Git и монтируется в /data/pxf/lib как read‑only.
5. Сервер PXF для bookings-db (jdbc-site.xml)
PXF использует концепцию «серверов» (servers/<имя>), где для каждого сервера хранится свой конфиг подключения (в т.ч. JDBC).
План:
- Создать сервер с именем
bookings-db(название привязываем к сервису Docker, чтобы не путаться). - Конфиг лежит в файле:
$PXF_BASE/servers/bookings-db/jdbc-site.xml.
- Внутри прописываем параметры подключения к демо‑БД
demoв Postgresbookings-db.
Черновой шаблон jdbc-site.xml (значения логина/пароля берём из .env, блок BOOKINGS_DB_*):
<?xml version="1.0" encoding="UTF-8"?>
<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_DB_USER}</value>
</property>
<property>
<name>jdbc.password</name>
<value>${BOOKINGS_DB_PASSWORD}</value>
</property>
</configuration>
Замечания:
- Здесь
${BOOKINGS_DB_USER}и${BOOKINGS_DB_PASSWORD}— просто напоминание, что значения нужно взять из.env; в реальном файле будут жёстко записаны строки (допустимо для локального учебного стенда). - Адрес
bookings-db:5432— имя сервиса и внутренний порт Postgres внутри сетиdocker compose. Внешний порт (${BOOKINGS_DB_PORT:-5434}) здесь не используется. - После правки конфигурации для надёжности планируем выполнять:
чтобы PXF подхватил новые настройки.
pxf cluster sync pxf cluster restart
6. Внешняя таблица в Greenplum (только для чтения)
Задача: завести одну external‑таблицу в Greenplum, которая читает данные из демо‑БД demo через PXF/JDBC.
Дизайн:
- Имя таблицы в Greenplum:
public.ext_bookings_bookings(подчёркиваем, что это внешнее представление таблицыbookings.bookingsиз Postgres). - Схема колонок должна совпадать со схемой исходной таблицы в
demo(её нужно будет аккуратно выписать отдельным шагом, через\d bookings.bookingsвbookings-db). - Локация PXF:
PROFILE=JDBC— используем JDBC‑профиль.SERVER=bookings-db— имя сервера изjdbc-site.xml.
Черновой шаблон DDL (без конкретных типов, заполним позже по реальной схеме):
CREATE EXTERNAL TABLE public.ext_bookings_bookings (
-- TODO: колонки как в bookings.bookings (будет уточнено)
)
LOCATION ('pxf://bookings.bookings?PROFILE=JDBC&SERVER=bookings-db')
FORMAT 'CUSTOM' (formatter='pxfwritable_import');
Комментарии:
- На этапе реализации нужно будет:
- в
bookings-dbпосмотреть структуру основного факт‑табличного объекта (скорее всегоbookings.bookings) и перенести DDL; - проверить типы дат/чисел, чтобы избежать сюрпризов на стороне GP.
- в
- Для MVP достаточно одной таблицы; позже можно добавить ещё 1–2 внешние таблицы для примеров (например, справочники).
7. План тестирования (без дополнительных make‑таргетов)
Цель тестов: показать студентам, что PXF настроен корректно и позволяет читать данные; при этом не плодить отдельные make‑цели, а использовать уже существующие (make up, make bookings-init, make gp-psql).
7.1. Позитивный сценарий (smoke)
Предварительные условия:
.envскопирован из.env.exampleи актуален (BOOKINGS_DB_*,GP_*выставлены).- В
docker-compose.ymlвключён PXF (GREENPLUM_PXF_ENABLE=trueв сервисеgreenplum). - Для
bookings-dbуже выполненmake bookings-init(есть данные вdemo).
Шаги (в будущем попадут в TESTING.md):
- Поднять стенд:
make up- дождаться healthcheck‑ов
pgmetaиgreenplum.
- (Первый раз) Установить JDBC‑драйвер и настроить сервер:
- зайти в контейнер
greenplumи подgpadminвыполнить команды из раздела 4 и 5 (скачивание JAR, созданиеjdbc-site.xml,pxf cluster sync && restart).
- зайти в контейнер
- Зайти в Greenplum:
make gp-psql.
- Проверить, что расширение PXF присутствует:
\dx pxf.
- Создать внешнюю таблицу
public.ext_bookings_bookings(DDL из раздела 6, уже с реальными колонками). - Выполнить простые запросы:
SELECT COUNT(*) FROM public.ext_bookings_bookings;SELECT * FROM public.ext_bookings_bookings LIMIT 5;
Ожидаемый результат:
- Запросы выполняются без ошибок, возвращают ненулевое количество строк.
- Структура данных визуально совпадает с данными в
bookings-db(можно дополнительно открытьbookings-psqlи сравнить).
7.2. Негативный сценарий (отказ источника)
Цель: показать, как выглядит ошибка, если источник недоступен, и что с этим делать.
Шаги:
- При работающем стенде остановить только
bookings-db:docker compose stop bookings-db.
- В
make gp-psqlпопробовать снова:SELECT 1 FROM public.ext_bookings_bookings LIMIT 1;
Ожидаемый результат:
- Запрос падает с ошибкой подключения к Postgres (через JDBC/pxf).
- В
TESTING.mdпланируем добавить короткую подсказку: «если видите ошибку подключения — убедитесь, что запущен сервисbookings-db(docker compose start bookings-db) и повторите запрос».
7.3. Идея для автоматического smoke‑теста (на будущее)
На будущее (не в рамках текущего этапа) можно добавить простой e2e‑тест в tests/, который:
- с помощью
psycopg2коннектится к Greenplum (GP_*из.env); - выполняет
SELECT 1 FROM public.ext_bookings_bookings LIMIT 1; - помечен как «integration» и запускается только по явному желанию (например, через отдельный маркер или переменную окружения).
Пока это остаётся идеей: сначала реализуем базовую конфигурацию PXF и ручной smoke‑чек‑лист.
8. Открытые вопросы / TODO
- Уточнить целевую таблицу(ы) в
demoдля внешнего представления (скорее всегоbookings.bookings), аккуратно выписать DDL и обновить шаблон из раздела 6. - Принять окончательное решение по версии JDBC‑драйвера и зафиксировать ссылку в документации (с учётом возможного обновления Postgres 16).
- Решить, хотим ли мы автоматизировать шаги установки драйвера/создания
jdbc-site.xmlчерез init‑скрипт в/docker-entrypoint-initdb.dили оставить их полностью ручными для наглядности.