RHEL 8.10 에 Python 3.11 을 올린 호스트에서 CDP 7.3.1 업그레이드를 진행하던 중 Django 예외로 단계가 멈춘다.
django.core.exceptions.ImproperlyConfigured:
Error loading MySQLdb module. Did you install mysqlclient?
CDP 에서 Django 로 동작하는 구성 요소는 Hue 다. Hue 는 기동과 업그레이드 과정에서 Django 의 스키마 마이그레이션을 수행하며, 백엔드가 MySQL 또는 MariaDB 이면 Python 드라이버 MySQLdb 를 적재한다. 이 드라이버는 mysqlclient 패키지가 제공한다.
오류는 Django 설정 문제도 CDP 결함도 아니고, Hue 가 사용하는 Python 환경에서 mysqlclient 를 적재하지 못한 것이다. 원인은 대개 둘 중 하나다.
첫째, mysqlclient 가 그 Python 환경에 설치돼 있지 않다. 폐쇄망에서 pip 이 패키지를 받지 못해 조용히 넘어간 경우가 많다.
둘째, 설치는 됐지만 적재에 실패한다. mysqlclient 는 순수 파이썬이 아니라 C 확장이라 mysql_config(또는 mariadb_config), 개발 헤더, 컴파일러가 있어야 빌드되고, Python minor 버전마다 다시 빌드해야 한다. 3.10 용으로 만든 휠은 3.11 에서 적재되지 않고 ImportError: undefined symbol ... 형태로 깨진다.
여기에 더해 Python 3.11 자체가 이 조합에서 검증된 구간이 아니다. Cloudera 는 릴리스마다 지원 OS·Python 버전을 지원 매트릭스로 고정하며, 매트릭스 밖의 Python 을 시스템 기본으로 올려 두면 이런 형태의 적재 실패가 반복된다. CDP 7.3.1 이 지원하는 정확한 Python 버전과 번들 Django 버전은 해당 릴리스의 지원 매트릭스에서 확인해야 한다 — 확인 필요.
먼저 릴리스 지원 매트릭스에서 허용되는 Python 버전을 확인하고 그 버전을 설치한다. 시스템 기본 python3 를 임의 버전으로 덮어쓰지 않는다. Cloudera Manager Agent 와 각 서비스 스크립트가 시스템 Python 을 전제로 동작하므로, 기본 링크를 바꾸면 업그레이드 도중 다른 단계가 깨진다.
dnf install -y python39 python39-devel python39-pip
python3.9 --version
dnf install -y gcc mariadb-devel openssl-devel libffi-devel pkgconfig
MariaDB 를 메타스토어로 쓰는 환경에서는 mysql-devel 보다 mariadb-devel 쪽이 헤더 경로 문제가 적다.
python3.9 -m pip install --no-cache-dir --force-reinstall mysqlclient
python3.9 -c "import MySQLdb; print(MySQLdb.__version__)"
설치 성공과 적재 성공은 다르므로 반드시 import 까지 확인한다.
외부망 장비에서 대상 Python 버전과 플랫폼을 지정해 받아 둔다.
pip download mysqlclient --python-version 39 \
--platform manylinux2014_x86_64 --only-binary=:all: -d ./wheels
폐쇄망 장비에서 로컬 디렉터리만 보고 설치한다.
python3.9 -m pip install --no-index --find-links ./wheels mysqlclient
pymysql.install_as_MySQLdb() 로 드라이버를 바꿔치기하는 우회는 Django 단독 애플리케이션에서는 통하지만 Cloudera 구성 요소에서는 지원 대상이 아니다. 업그레이드 스크립트가 드라이버 고유 동작에 의존하는 지점에서 다시 깨지고, 재현이 어려운 장애로 남는다. 업그레이드 도중이라면 더욱 쓰지 않는다.
import MySQLdb 가 성공하는 상태에서 업그레이드 단계를 다시 실행하고, Hue 서비스가 기동되며 Django 마이그레이션 로그에 예외가 남지 않는지 확인한다.