фикс бага pxf

This commit is contained in:
2026-01-08 22:02:57 +03:00
parent 33fc42f883
commit 5778ad6601
8 changed files with 298 additions and 35 deletions
+81 -26
View File
@@ -1,38 +1,93 @@
#!/usr/bin/env bash
# Простой init-скрипт для настройки PXF:
# - кладёт JDBC-драйвер PostgreSQL в каталог PXF;
# - копирует jdbc-site.xml для сервера bookings-db;
# - выполняет pxf cluster sync.
# Скрипт выполняется только при первой инициализации Greenplum (пустой /data).
# Идемпотентная подготовка PXF на каждом запуске контейнера:
# - копирует JDBC-драйвер и конфиг сервера из образа в PXF_BASE;
# - не перезаписывает файлы, если не задан PXF_SEED_OVERWRITE=1;
# - синхронизацию pxf выполняет только при PXF_SYNC_ON_START=1.
set -euo pipefail
GREENPLUM_USER=${GREENPLUM_USER:-gpadmin}
PXF_SEED_DIR="${PXF_SEED_DIR:-/opt/pxf-seed}"
PXF_CONF_SEED_DIR="${PXF_CONF_SEED_DIR:-/usr/local/pxf/conf}"
PXF_BASE_DEFAULT="${GREENPLUM_DATA_DIRECTORY:-/data}/pxf"
PXF_BASE="${PXF_BASE:-$PXF_BASE_DEFAULT}"
PXF_SEED_OVERWRITE="${PXF_SEED_OVERWRITE:-0}"
PXF_SYNC_ON_START="${PXF_SYNC_ON_START:-0}"
# Пробуем подтянуть PXF_BASE из .bashrc пользователя Greenplum
if [ -f "/home/${GREENPLUM_USER}/.bashrc" ]; then
# shellcheck disable=SC1090
source "/home/${GREENPLUM_USER}/.bashrc"
log_info() {
echo "INFO - $*"
}
log_warn() {
echo "WARN - $*"
}
copy_seed_file() {
local src="$1"
local dst="$2"
local label="$3"
if [ ! -f "${src}" ]; then
log_warn "seed-файл не найден: ${src}"
return 0
fi
if [ "${PXF_SEED_OVERWRITE}" = "1" ] || [ ! -f "${dst}" ]; then
cp -f "${src}" "${dst}"
log_info "${label}: установлено в ${dst}"
return 0
fi
log_info "${label}: уже существует, пропускаем"
}
mkdir -p "${PXF_BASE}/lib" "${PXF_BASE}/servers/bookings-db" "${PXF_BASE}/conf"
mkdir -p "${PXF_BASE}/run" "${PXF_BASE}/logs"
copy_seed_file \
"${PXF_SEED_DIR}/postgresql-42.7.3.jar" \
"${PXF_BASE}/lib/postgresql-jdbc.jar" \
"JDBC драйвер PostgreSQL"
copy_seed_file \
"${PXF_SEED_DIR}/servers/bookings-db/jdbc-site.xml" \
"${PXF_BASE}/servers/bookings-db/jdbc-site.xml" \
"jdbc-site.xml для bookings-db"
copy_seed_file \
"${PXF_CONF_SEED_DIR}/pxf-application.properties" \
"${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"
# Устанавливаем уменьшенные JVM-опции, если они ещё не заданы явно
if [ -f "${PXF_BASE}/conf/pxf-env.sh" ]; then
if ! grep -Eq '^[[:space:]]*export[[:space:]]+PXF_JVM_OPTS=' "${PXF_BASE}/conf/pxf-env.sh"; then
echo 'export PXF_JVM_OPTS="-Xmx512m -Xms256m"' >> "${PXF_BASE}/conf/pxf-env.sh"
log_info "PXF_JVM_OPTS: установлен уменьшенный профиль памяти"
fi
fi
PXF_BASE=${PXF_BASE:-$PXF_BASE_DEFAULT}
copy_seed_file \
"${PXF_CONF_SEED_DIR}/pxf-log4j2.xml" \
"${PXF_BASE}/conf/pxf-log4j2.xml" \
"pxf-log4j2.xml"
mkdir -p "${PXF_BASE}/lib" "${PXF_BASE}/servers/bookings-db"
copy_seed_file \
"${PXF_CONF_SEED_DIR}/pxf-profiles.xml" \
"${PXF_BASE}/conf/pxf-profiles.xml" \
"pxf-profiles.xml"
# Копируем JAR-драйвер, если он ещё не установлен
if [ -f /pxf-local/postgresql-42.7.3.jar ] && [ ! -f "${PXF_BASE}/lib/postgresql-jdbc.jar" ]; then
cp /pxf-local/postgresql-42.7.3.jar "${PXF_BASE}/lib/postgresql-jdbc.jar"
if [ "${PXF_SYNC_ON_START}" = "1" ]; then
if command -v pxf >/dev/null 2>&1; then
if ! pxf cluster sync; then
log_warn "pxf cluster sync завершился с ошибкой"
fi
else
log_warn "pxf не найден в PATH, пропускаем pxf cluster sync"
fi
fi
# Копируем jdbc-site.xml для сервера bookings-db, если его нет
if [ -f /pxf-local/servers/bookings-db/jdbc-site.xml ] && [ ! -f "${PXF_BASE}/servers/bookings-db/jdbc-site.xml" ]; then
cp /pxf-local/servers/bookings-db/jdbc-site.xml "${PXF_BASE}/servers/bookings-db/jdbc-site.xml"
fi
# Синхронизируем конфигурацию PXF (на всякий случай)
if command -v pxf >/dev/null 2>&1; then
pxf cluster sync || true
fi
+42
View File
@@ -0,0 +1,42 @@
#!/usr/bin/env bash
set -euo pipefail
ensure_script="/opt/pxf-scripts/ensure_pxf_bookings.sh"
ensure_pxf_extension() {
local gp_user="${GREENPLUM_USER:-gpadmin}"
local gp_db="${GREENPLUM_DATABASE_NAME:-gp_dwh}"
local gp_password="${GREENPLUM_PASSWORD:-gpadmin}"
local attempts=60
if [ "${GREENPLUM_PXF_ENABLE:-false}" != "true" ]; then
return 0
fi
for _ 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 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"
fi
return 0
fi
sleep 2
done
echo "WARN - Greenplum не готов, пропускаем CREATE EXTENSION pxf"
}
if [ -f "${ensure_script}" ]; then
"${ensure_script}"
else
echo "WARN - не найден ensure-скрипт PXF: ${ensure_script}"
fi
ensure_pxf_extension &
exec /start_gpdb.sh