фикс pxf
This commit is contained in:
@@ -150,10 +150,10 @@ make gp-psql # Подключение к Greenplum
|
||||
|
||||
- базовые конфиги PXF копируются в `PXF_BASE/conf` (если их ещё нет);
|
||||
- создаются каталоги `PXF_BASE/run` и `PXF_BASE/logs`;
|
||||
- `CREATE EXTENSION pxf` выполняется автоматически, когда Greenplum становится доступен.
|
||||
- `CREATE EXTENSION pxf` выполняется автоматически, когда Greenplum становится доступен (с ретраями).
|
||||
|
||||
Healthcheck сервиса `greenplum` учитывает не только готовность Greenplum, но и запуск PXF —
|
||||
это нужно, чтобы Airflow не стартовал раньше PXF.
|
||||
Healthcheck сервиса `greenplum` учитывает не только готовность Greenplum, но и запуск PXF,
|
||||
а также наличие `extension pxf` — это нужно, чтобы Airflow не стартовал раньше PXF.
|
||||
|
||||
Сборка и запуск:
|
||||
|
||||
|
||||
+1
-1
@@ -86,7 +86,7 @@ services:
|
||||
healthcheck:
|
||||
# Ждём не только доступность GPDB, но и готовность PXF,
|
||||
# чтобы Airflow не стартовал раньше PXF.
|
||||
test: [ "CMD-SHELL", "/usr/local/greenplum-db/bin/pg_isready -h 127.0.0.1 -p 5432 -U ${GP_USER:-gpadmin} -d ${GP_DB:-gp_dwh} && su - ${GP_USER:-gpadmin} -c '/usr/local/pxf/bin/pxf cluster status' >/dev/null 2>&1" ]
|
||||
test: [ "CMD-SHELL", "/usr/local/greenplum-db/bin/pg_isready -h 127.0.0.1 -p 5432 -U ${GP_USER:-gpadmin} -d ${GP_DB:-gp_dwh} && PGPASSWORD=${GP_PASSWORD:-gpadmin} /usr/local/greenplum-db/bin/psql -h 127.0.0.1 -p 5432 -U ${GP_USER:-gpadmin} -d ${GP_DB:-gp_dwh} -t -A -c \"SELECT 1 FROM pg_extension WHERE extname='pxf';\" | grep -q 1 && su - ${GP_USER:-gpadmin} -c '/usr/local/pxf/bin/pxf cluster status' >/dev/null 2>&1" ]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
|
||||
@@ -101,13 +101,13 @@
|
||||
- причина: файлы уже лежат в `PXF_BASE` на томе, а seed из образа по умолчанию не перетирает их;
|
||||
- решение: `make build` + restart `greenplum` + (при необходимости) `PXF_SEED_OVERWRITE=1`.
|
||||
|
||||
## 9. Известная проблема: `protocol "pxf" does not exist` на «холодном старте»
|
||||
## 9. Известная проблема: `protocol "pxf" does not exist` на «холодном старте» (исправлено)
|
||||
|
||||
Иногда (и это воспроизводится в `./scripts/e2e_smoke.sh`) при первом `make ddl-gp` можно получить:
|
||||
Раньше (воспроизводилось в `./scripts/e2e_smoke.sh`) при первом `make ddl-gp` можно было получить:
|
||||
|
||||
`ERROR: protocol "pxf" does not exist`
|
||||
|
||||
### Почему так происходит
|
||||
### Почему так происходило
|
||||
|
||||
В базовом `/start_gpdb.sh` из образа Greenplum создание расширения `pxf` связано с проверкой
|
||||
файла `${PXF_BASE}/conf/pxf-env.sh`:
|
||||
@@ -116,35 +116,23 @@
|
||||
`CREATE EXTENSION IF NOT EXISTS pxf`;
|
||||
- если `pxf-env.sh` **уже существует**, этот блок **пропускается**, и расширение может не появиться.
|
||||
|
||||
При этом наш ensure‑скрипт `pxf/init/10_pxf_bookings.sh` копирует `pxf-env.sh` в `${PXF_BASE}`
|
||||
ещё до запуска Greenplum, из‑за чего базовый скрипт считает PXF “уже настроенным” и
|
||||
пропускает создание расширения.
|
||||
При этом наш ensure‑скрипт `pxf/init/10_pxf_bookings.sh` копировал `pxf-env.sh` в `${PXF_BASE}`
|
||||
ещё до запуска Greenplum, из‑за чего базовый скрипт считал PXF “уже настроенным” и
|
||||
пропускал создание расширения.
|
||||
|
||||
Отдельно `/start_greenplum_with_pxf.sh` пытается выполнить `CREATE EXTENSION IF NOT EXISTS pxf`
|
||||
в фоне, но это может “не попасть” в окно готовности базы (гонка при старте), поэтому после старта:
|
||||
- PXF может быть “running” (`pxf cluster status`), но
|
||||
- `protocol pxf` в базе ещё не создан.
|
||||
### Что изменили
|
||||
|
||||
### Как проверить
|
||||
- ensure‑скрипт больше не копирует `pxf-env.sh`, если файла ещё нет (даём `/start_gpdb.sh` создать его);
|
||||
- в `start_greenplum_with_pxf.sh` добавлена retry‑логика с проверкой наличия extension;
|
||||
- healthcheck `greenplum` ждёт не только PXF, но и наличие `extension pxf`.
|
||||
|
||||
- `docker compose exec greenplum bash -lc "su - gpadmin -c '/usr/local/greenplum-db/bin/psql -d gp_dwh -t -A -c \"SELECT extname FROM pg_extension WHERE extname = ''pxf'';\"'"`
|
||||
### Если ошибка всё ещё возникает
|
||||
|
||||
Если команда ничего не вернула — расширение не создано.
|
||||
1) Пересоберите образ и перезапустите контейнер `greenplum`:
|
||||
`make build && make down && make up`
|
||||
|
||||
### Временный workaround (ручной)
|
||||
|
||||
1) Создать расширение:
|
||||
`docker compose exec greenplum bash -lc "su - gpadmin -c '/usr/local/greenplum-db/bin/psql -d gp_dwh -c \"CREATE EXTENSION IF NOT EXISTS pxf;\"'"`
|
||||
|
||||
2) Повторить DDL:
|
||||
`make ddl-gp`
|
||||
|
||||
### Что чинить в коде (идея фикса)
|
||||
|
||||
Сделать создание расширения `pxf` независимым от наличия `pxf-env.sh`:
|
||||
- либо убрать/изменить условие в `/start_gpdb.sh` (в образе),
|
||||
- либо перестать копировать `pxf-env.sh` в ensure‑скрипте и дать базовому скрипту создать его,
|
||||
- либо сделать retry‑логику `CREATE EXTENSION pxf` надёжной (повторять попытки и проверять результат).
|
||||
2) Проверьте наличие extension:
|
||||
`docker compose exec greenplum bash -lc "su - gpadmin -c '/usr/local/greenplum-db/bin/psql -d gp_dwh -t -A -c \"SELECT extname FROM pg_extension WHERE extname = ''pxf'';\"'"`
|
||||
|
||||
## 8. Связанные файлы
|
||||
|
||||
|
||||
@@ -61,10 +61,14 @@ copy_seed_file \
|
||||
"${PXF_BASE}/conf/pxf-application.properties" \
|
||||
"pxf-application.properties"
|
||||
|
||||
copy_seed_file \
|
||||
"${PXF_CONF_SEED_DIR}/pxf-env.sh" \
|
||||
"${PXF_BASE}/conf/pxf-env.sh" \
|
||||
"pxf-env.sh"
|
||||
if [ -f "${PXF_BASE}/conf/pxf-env.sh" ]; then
|
||||
copy_seed_file \
|
||||
"${PXF_CONF_SEED_DIR}/pxf-env.sh" \
|
||||
"${PXF_BASE}/conf/pxf-env.sh" \
|
||||
"pxf-env.sh"
|
||||
else
|
||||
log_info "pxf-env.sh отсутствует в ${PXF_BASE}/conf, пропускаем копирование до инициализации PXF"
|
||||
fi
|
||||
|
||||
# Устанавливаем уменьшенные JVM-опции, если они ещё не заданы явно
|
||||
if [ -f "${PXF_BASE}/conf/pxf-env.sh" ]; then
|
||||
|
||||
@@ -13,22 +13,35 @@ ensure_pxf_extension() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
for _ in $(seq 1 "${attempts}"); do
|
||||
extension_exists() {
|
||||
local result
|
||||
result=$(PGPASSWORD="${gp_password}" /usr/local/greenplum-db/bin/psql \
|
||||
-h 127.0.0.1 -p 5432 -U "${gp_user}" -d "${gp_db}" \
|
||||
-t -A -c "SELECT 1 FROM pg_extension WHERE extname='pxf';" 2>/dev/null || true)
|
||||
[ "${result}" = "1" ]
|
||||
}
|
||||
|
||||
for attempt in $(seq 1 "${attempts}"); do
|
||||
if /usr/local/greenplum-db/bin/pg_isready \
|
||||
-h 127.0.0.1 -p 5432 -U "${gp_user}" -d "${gp_db}" >/dev/null 2>&1; then
|
||||
if extension_exists; then
|
||||
echo "INFO - extension pxf уже создано"
|
||||
return 0
|
||||
fi
|
||||
if PGPASSWORD="${gp_password}" /usr/local/greenplum-db/bin/psql \
|
||||
-h 127.0.0.1 -p 5432 -U "${gp_user}" -d "${gp_db}" \
|
||||
-v ON_ERROR_STOP=1 -c "CREATE EXTENSION IF NOT EXISTS pxf;" >/dev/null; then
|
||||
echo "INFO - extension pxf готово"
|
||||
else
|
||||
echo "WARN - не удалось создать extension pxf"
|
||||
-v ON_ERROR_STOP=1 -c "CREATE EXTENSION IF NOT EXISTS pxf;" >/dev/null 2>&1; then
|
||||
if extension_exists; then
|
||||
echo "INFO - extension pxf готово"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
echo "WARN - попытка ${attempt}/${attempts}: не удалось создать extension pxf"
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo "WARN - Greenplum не готов, пропускаем CREATE EXTENSION pxf"
|
||||
echo "WARN - Greenplum не готов или extension pxf не создано"
|
||||
}
|
||||
|
||||
if [ -f "${ensure_script}" ]; then
|
||||
|
||||
Reference in New Issue
Block a user