문제 해결 / 패키지를 import할 수 없거나 버전 오류
1. 서론
일반적인 Python 개발에서는 타사 패키지를 변경할 때마다 시스템을 다시 시작해야 합니다.
하지만 DataFlux Func에서는 개발 편의를 위해 타사 패키지를 설치할 때 DataFlux Func 시스템 전체를 다시 시작할 필요가 없습니다.
하지만 이것이 100% 확실하다고 보장할 수는 없습니다.
DataFlux Func를 다시 시작하지 않고도 정상적으로 설치·업그레이드할 수 있는 타사 패키지는 다음 조건을 충족해야 합니다.
- 순수 Python으로 작성된 패키지(예: C 확장을 포함하지 않음)
- 사전 로드 콘텐츠가 없는 패키지(예: 각종 빅데이터 모델)
어떤 타사 패키지가 위 조건을 충족하지 못하면 최초 설치 시에만 정상적으로 사용할 수 있으며, 이후 업데이트에는 DataFlux Func 전체를 다시 시작해야 합니다.
2. 장애 사례 numpy
흔히 사용되는 numpy 패키지는 C 확장을 사용하는 전형적인 패키지입니다. DataFlux Func를 배포한 후 처음 numpy를 설치하면 정상적으로 사용할 수 있지만, 이후 다른 버전의 numpy를 다시 설치하면.
그렇다면 다음과 같은 몇 가지 장애가 발생할 수 있습니다:
2.1 numpy를 import할 수 없음
numpy를 예로 들면, 스크립트가 import numpy를 실행할 때 다음과 같은 오류가 발생했습니다.
| Text Only | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
2.2 numpy는 사용 가능하지만 이전 버전이 호출됨
numpy를 예로 들면, 패키지 객체의 __version___를 출력하면 실제 코드 실행 과정에서 numpy 패키지의 버전을 확인할 수 있지만, 실제 설치된 버전과 일치하지 않습니다.
| Python | |
|---|---|
1 | |
이 상황을 충족한다고 해서 코드가 여전히 정상적으로 실행될 수 있다는 의미는 아닙니다. 단순히 DataFlux Func를 다시 시작하면 다시 위의 1.1 문제로 변하므로, 절대 간과해서는 안 됩니다
3. 원인 설명
numpy와 같은 타사 패키지는 설치 과정에서 추가 리소스(예: 컴파일이 필요한 다른 언어의 코드, 데이터 모델 등)를 다운로드하는 경우가 있을 수 있습니다. 최초 설치 후에는 Python이 이 타사 패키지를 정상적으로 읽고 외부 데이터를 로드할 수 있습니다.
하지만 동일한 패키지의 다른 버전을 다시 설치할 때는, 이전 버전의 리소스 파일이 여전히 사용 중이라 실제로 업데이트 / 덮어쓰기가 불가능하여 올바르게 설치되지 않습니다.
이때 DataFlux Func에는 다음과 같은 몇 가지 상황이 있습니다:
- 어떤 Worker 프로세스가 이전에 이미 이 타사 패키지를
import한 적이 있다면, 해당 Worker 프로세스는 캐시된 데이터에 의존하여 계속 실행될 수 있지만, 호출되는 버전은 이전 버전(및 최초 캐시된 버전)으로 나타납니다. - 어떤 Worker 프로세스가 이전에 이 타사 패키지를 한 번도
import한 적이 없다면, 처음import하고 관련 리소스를 로드할 때, 이 패키지가 두 번째 설치 시 올바르게 설치되지 않았으므로 정상적으로import할 수 없습니다. - 이때 DataFlux Func를 다시 시작하면, 위의 상황 1.은 다시 시작으로 캐시가 해제되어 위의 상황 2.로 바뀌게 됩니다.
4. 해결 방법
numpy 1.22.1을 예로 들면, 설치 후 리소스 디렉터리 / extra-python-packages 아래에 다음과 같은 폴더가 생성됩니다.
numpynumpy-1.22.1.dist-infonumpy.libs
리소스 디렉터리의 호스트 기본 위치는 /usr/local/dataflux-func/data/resources/extra-python-packages입니다
리소스 디렉터리의 컨테이너 내부 위치는 /data/resources/extra-python-packages입니다
이 문제를 해결하기 위한 작업 절차는 다음과 같습니다:
- 위의
numpy관련 폴더를 완전히 삭제합니다. - DataFlux Func 다시 시작
numpy재설치