Skip to content

문제 해결 / 패키지를 import할 수 없거나 버전 오류

1. 서론

일반적인 Python 개발에서는 타사 패키지를 변경할 때마다 시스템을 다시 시작해야 합니다.

하지만 DataFlux Func에서는 개발 편의를 위해 타사 패키지를 설치할 때 DataFlux Func 시스템 전체를 다시 시작할 필요가 없습니다.

하지만 이것이 100% 확실하다고 보장할 수는 없습니다.

DataFlux Func를 다시 시작하지 않고도 정상적으로 설치·업그레이드할 수 있는 타사 패키지는 다음 조건을 충족해야 합니다.

  1. 순수 Python으로 작성된 패키지(예: C 확장을 포함하지 않음)
  2. 사전 로드 콘텐츠가 없는 패키지(예: 각종 빅데이터 모델)

어떤 타사 패키지가 위 조건을 충족하지 못하면 최초 설치 시에만 정상적으로 사용할 수 있으며, 이후 업데이트에는 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
#1 --------------------
함수 실행: demo__demo.test_numpy()

오류 스택:
Traceback (most recent call last):
  File "demo__demo", line 1, in <module>
    import numpy
ImportError:
중요: 이 문제를 해결하기 위한 조언을 보려면 이 내용을 읽어 주세요!
numpy C-확장을 import하지 못했습니다. 이 오류는 여러 가지 이유로,
주로 환경 설정이나 NumPy 설치 방식의 문제로 인해 발생할 수 있습니다.
일반적인 원인과 문제 해결 팁은 다음에서 정리했습니다:
    https://numpy.org/devdocs/user/troubleshooting-importerror.html
다음 항목을 확인해 주세요:
  * Python 버전: "/opt/python/bin/python3.8"의 Python3.8
  * NumPy 버전: "1.22.1"
예상한 버전과 일치하는지 확인하십시오.
자세한 내용은 위에 링크된 문서를 참조하시기 바랍니다.
원래 오류: libopenblas64_p-r0-2f7c42d4.3.18.so: 공유 객체 파일을 열 수 없습니다:
해당 파일 또는 디렉터리가 없습니다

2.2 numpy는 사용 가능하지만 이전 버전이 호출됨

numpy를 예로 들면, 패키지 객체의 __version___를 출력하면 실제 코드 실행 과정에서 numpy 패키지의 버전을 확인할 수 있지만, 실제 설치된 버전과 일치하지 않습니다.

Python
1
print(numpy.__version__)

이 상황을 충족한다고 해서 코드가 여전히 정상적으로 실행될 수 있다는 의미는 아닙니다. 단순히 DataFlux Func를 다시 시작하면 다시 위의 1.1 문제로 변하므로, 절대 간과해서는 안 됩니다

3. 원인 설명

numpy와 같은 타사 패키지는 설치 과정에서 추가 리소스(예: 컴파일이 필요한 다른 언어의 코드, 데이터 모델 등)를 다운로드하는 경우가 있을 수 있습니다. 최초 설치 후에는 Python이 이 타사 패키지를 정상적으로 읽고 외부 데이터를 로드할 수 있습니다.

하지만 동일한 패키지의 다른 버전을 다시 설치할 때는, 이전 버전의 리소스 파일이 여전히 사용 중이라 실제로 업데이트 / 덮어쓰기가 불가능하여 올바르게 설치되지 않습니다.

이때 DataFlux Func에는 다음과 같은 몇 가지 상황이 있습니다:

  1. 어떤 Worker 프로세스가 이전에 이미 이 타사 패키지를 import한 적이 있다면, 해당 Worker 프로세스는 캐시된 데이터에 의존하여 계속 실행될 수 있지만, 호출되는 버전은 이전 버전(및 최초 캐시된 버전)으로 나타납니다.
  2. 어떤 Worker 프로세스가 이전에 이 타사 패키지를 한 번도 import한 적이 없다면, 처음 import하고 관련 리소스를 로드할 때, 이 패키지가 두 번째 설치 시 올바르게 설치되지 않았으므로 정상적으로 import할 수 없습니다.
  3. 이때 DataFlux Func를 다시 시작하면, 위의 상황 1.은 다시 시작으로 캐시가 해제되어 위의 상황 2.로 바뀌게 됩니다.

4. 해결 방법

numpy 1.22.1을 예로 들면, 설치 후 리소스 디렉터리 / extra-python-packages 아래에 다음과 같은 폴더가 생성됩니다.

  1. numpy
  2. numpy-1.22.1.dist-info
  3. numpy.libs

리소스 디렉터리의 호스트 기본 위치는 /usr/local/dataflux-func/data/resources/extra-python-packages입니다

리소스 디렉터리의 컨테이너 내부 위치는 /data/resources/extra-python-packages입니다

이 문제를 해결하기 위한 작업 절차는 다음과 같습니다:

  1. 위의 numpy 관련 폴더를 완전히 삭제합니다.
  2. DataFlux Func 다시 시작
  3. numpy 재설치