фикс pxf
This commit is contained in:
@@ -150,10 +150,10 @@ make gp-psql # Подключение к Greenplum
|
|||||||
|
|
||||||
- базовые конфиги PXF копируются в `PXF_BASE/conf` (если их ещё нет);
|
- базовые конфиги PXF копируются в `PXF_BASE/conf` (если их ещё нет);
|
||||||
- создаются каталоги `PXF_BASE/run` и `PXF_BASE/logs`;
|
- создаются каталоги `PXF_BASE/run` и `PXF_BASE/logs`;
|
||||||
- `CREATE EXTENSION pxf` выполняется автоматически, когда Greenplum становится доступен.
|
- `CREATE EXTENSION pxf` выполняется автоматически, когда Greenplum становится доступен (с ретраями).
|
||||||
|
|
||||||
Healthcheck сервиса `greenplum` учитывает не только готовность Greenplum, но и запуск PXF —
|
Healthcheck сервиса `greenplum` учитывает не только готовность Greenplum, но и запуск PXF,
|
||||||
это нужно, чтобы Airflow не стартовал раньше PXF.
|
а также наличие `extension pxf` — это нужно, чтобы Airflow не стартовал раньше PXF.
|
||||||
|
|
||||||
Сборка и запуск:
|
Сборка и запуск:
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -86,7 +86,7 @@ services:
|
|||||||
healthcheck:
|
healthcheck:
|
||||||
# Ждём не только доступность GPDB, но и готовность PXF,
|
# Ждём не только доступность GPDB, но и готовность PXF,
|
||||||
# чтобы Airflow не стартовал раньше 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
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 30
|
retries: 30
|
||||||
|
|||||||
@@ -101,13 +101,13 @@
|
|||||||
- причина: файлы уже лежат в `PXF_BASE` на томе, а seed из образа по умолчанию не перетирает их;
|
- причина: файлы уже лежат в `PXF_BASE` на томе, а seed из образа по умолчанию не перетирает их;
|
||||||
- решение: `make build` + restart `greenplum` + (при необходимости) `PXF_SEED_OVERWRITE=1`.
|
- решение: `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`
|
`ERROR: protocol "pxf" does not exist`
|
||||||
|
|
||||||
### Почему так происходит
|
### Почему так происходило
|
||||||
|
|
||||||
В базовом `/start_gpdb.sh` из образа Greenplum создание расширения `pxf` связано с проверкой
|
В базовом `/start_gpdb.sh` из образа Greenplum создание расширения `pxf` связано с проверкой
|
||||||
файла `${PXF_BASE}/conf/pxf-env.sh`:
|
файла `${PXF_BASE}/conf/pxf-env.sh`:
|
||||||
@@ -116,35 +116,23 @@
|
|||||||
`CREATE EXTENSION IF NOT EXISTS pxf`;
|
`CREATE EXTENSION IF NOT EXISTS pxf`;
|
||||||
- если `pxf-env.sh` **уже существует**, этот блок **пропускается**, и расширение может не появиться.
|
- если `pxf-env.sh` **уже существует**, этот блок **пропускается**, и расширение может не появиться.
|
||||||
|
|
||||||
При этом наш ensure‑скрипт `pxf/init/10_pxf_bookings.sh` копирует `pxf-env.sh` в `${PXF_BASE}`
|
При этом наш ensure‑скрипт `pxf/init/10_pxf_bookings.sh` копировал `pxf-env.sh` в `${PXF_BASE}`
|
||||||
ещё до запуска Greenplum, из‑за чего базовый скрипт считает PXF “уже настроенным” и
|
ещё до запуска 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 (ручной)
|
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'';\"'"`
|
||||||
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` надёжной (повторять попытки и проверять результат).
|
|
||||||
|
|
||||||
## 8. Связанные файлы
|
## 8. Связанные файлы
|
||||||
|
|
||||||
|
|||||||
@@ -61,10 +61,14 @@ copy_seed_file \
|
|||||||
"${PXF_BASE}/conf/pxf-application.properties" \
|
"${PXF_BASE}/conf/pxf-application.properties" \
|
||||||
"pxf-application.properties"
|
"pxf-application.properties"
|
||||||
|
|
||||||
copy_seed_file \
|
if [ -f "${PXF_BASE}/conf/pxf-env.sh" ]; then
|
||||||
"${PXF_CONF_SEED_DIR}/pxf-env.sh" \
|
copy_seed_file \
|
||||||
"${PXF_BASE}/conf/pxf-env.sh" \
|
"${PXF_CONF_SEED_DIR}/pxf-env.sh" \
|
||||||
"pxf-env.sh"
|
"${PXF_BASE}/conf/pxf-env.sh" \
|
||||||
|
"pxf-env.sh"
|
||||||
|
else
|
||||||
|
log_info "pxf-env.sh отсутствует в ${PXF_BASE}/conf, пропускаем копирование до инициализации PXF"
|
||||||
|
fi
|
||||||
|
|
||||||
# Устанавливаем уменьшенные JVM-опции, если они ещё не заданы явно
|
# Устанавливаем уменьшенные JVM-опции, если они ещё не заданы явно
|
||||||
if [ -f "${PXF_BASE}/conf/pxf-env.sh" ]; then
|
if [ -f "${PXF_BASE}/conf/pxf-env.sh" ]; then
|
||||||
|
|||||||
@@ -13,22 +13,35 @@ ensure_pxf_extension() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
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 \
|
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
|
-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 \
|
if PGPASSWORD="${gp_password}" /usr/local/greenplum-db/bin/psql \
|
||||||
-h 127.0.0.1 -p 5432 -U "${gp_user}" -d "${gp_db}" \
|
-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
|
-v ON_ERROR_STOP=1 -c "CREATE EXTENSION IF NOT EXISTS pxf;" >/dev/null 2>&1; then
|
||||||
echo "INFO - extension pxf готово"
|
if extension_exists; then
|
||||||
else
|
echo "INFO - extension pxf готово"
|
||||||
echo "WARN - не удалось создать extension pxf"
|
return 0
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
return 0
|
echo "WARN - попытка ${attempt}/${attempts}: не удалось создать extension pxf"
|
||||||
fi
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "WARN - Greenplum не готов, пропускаем CREATE EXTENSION pxf"
|
echo "WARN - Greenplum не готов или extension pxf не создано"
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ -f "${ensure_script}" ]; then
|
if [ -f "${ensure_script}" ]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user