Cloudera Manager 의 Hue 추가 마법사가 Test Connection 에서 실패한다. PostgreSQL 16 을 쓰고 있고 psql -h <host> -U hue -d hue 는 정상이며 다른 서비스(SCM · Hive · Oozie) 도 같은 DB 에 잘 붙는다. Hue 프로세스 로그는 is_db_alive 가 돌다 갑자기 끊긴다.
핵심 차이는 접속 방식이다. 다른 서비스는 JDBC(Java) 로 붙고 Hue 만 psycopg2(libpq) 로 붙는다. 따라서 문제도 해결도 Hue 가 쓰는 libpq 한정이다.
HUE_HOME=/opt/cloudera/parcels/CDH-<version>/lib/hue
HUE_PYTHON=$HUE_HOME/build/env/bin/python
$HUE_PYTHON -c "import psycopg2; print(psycopg2.__version__)"
find $HUE_HOME -name "_psycopg*.so" 2>/dev/null
없으면 Hue 가상환경의 pip 으로 설치한다. 폐쇄망이면 외부에서 whl 을 받아 옮긴다.
pip download psycopg2-binary --python-version 311 \
--platform manylinux_2_17_x86_64 --only-binary=:all: -d /tmp/
$HUE_HOME/build/env/bin/pip install --no-index --find-links /tmp/ psycopg2-binary
시스템 site-packages 에만 들어가 Hue 가상환경이 못 찾는 경우가 있다. 그럴 때는 디렉터리를 복사해 넣는다.
cp -r /usr/local/lib64/python3.11/site-packages/psycopg2 \
$HUE_HOME/build/env/lib/python3.11/site-packages/
cp -r /usr/local/lib64/python3.11/site-packages/psycopg2_binary* \
$HUE_HOME/build/env/lib/python3.11/site-packages/
Kerberos 가 켜진 환경에서 libpq 는 접속할 때 GSSAPI 암호화를 먼저 시도한다. 이 협상 과정에서 Hue 의 프로세스가 segfault 로 죽는 것이 실제 원인이었다. 환경변수 하나로 이 협상을 끈다.
export PGGSSENCMODE=disable
HUE_CONF_DIR=/var/run/cloudera-scm-agent/process/<번호>-hue-HUE_SERVER \
$HUE_HOME/build/env/bin/hue migrate --noinput --cm-managed
마이그레이션 도중 relation "useradmin_userprofile" does not exist 같은 traceback 이 길게 나와도 무시해도 된다. 마이그레이션 전에 메트릭 리포터가 아직 없는 테이블을 조회해서 나는 것이고, 마지막 exit 코드가 0 이면 스키마는 정상 생성된 것이다.
PostgreSQL 서버 쪽에서 GSSAPI 를 끄는 방법은 쓰면 안 된다. 같은 서버에 다른 서비스가 다 붙어 있기 때문이다. 문제는 Hue 의 클라이언트에 한정된다.
/etc/default/cloudera-scm-agent 에 넣는 것으로는 부족하다. 그것은 agent 데몬 자신의 환경이고, agent 가 supervisord 를 통해 띄우는 자식 프로세스까지 항상 상속되지는 않는다.
마법사가 아직 막혀 있어 Safety Valve 를 쓸 수 없는 단계에서는 CM agent 의 서비스 스크립트에 임시로 박아 돌파한다.
cp /opt/cloudera/cm-agent/service/hue/hue.sh /opt/cloudera/cm-agent/service/hue/hue.sh.bak
sed -i '1a export PGGSSENCMODE=disable' /opt/cloudera/cm-agent/service/hue/hue.sh
head -5 /opt/cloudera/cm-agent/service/hue/hue.sh
Test Connection 이 통과하고 서비스가 추가되면 정석 위치로 옮긴다. Cloudera Manager → Hue → Configuration 에서 environment 를 검색해 Hue Service Environment Advanced Configuration Snippet (Safety Valve) 에 넣는다.
PGGSSENCMODE=disable
저장하고 Deploy Client Configuration 한 뒤 임시로 고친 스크립트를 원복한다. 이렇게 해야 agent 업그레이드 때 날아가지 않는다.
cp /opt/cloudera/cm-agent/service/hue/hue.sh.bak /opt/cloudera/cm-agent/service/hue/hue.sh
CM 의 Test Connection 은 HUE_SERVER 가 아니라 HUE-test-db-connection 이라는 별도 프로세스 디렉터리를 쓴다. 어디에 환경변수가 들어갔는지 확인할 때는 그쪽을 본다.
ls -lt /var/run/cloudera-scm-agent/process/ | grep -i hue | head -3
grep -rn "PGGSSENCMODE" /var/run/cloudera-scm-agent/process/<번호>-HUE-test-db-connection/
CM agent 쪽 /opt/cloudera/cm-agent/service/hue/hue.sh 와 파셀 쪽 /opt/cloudera/parcels/.../lib/hue/tools/scripts/hue.sh 는 서로 다른 파일이다. KT_RENEWER 는 후자를 탄다.