[Trouble Shooting] Pyspark ImportError: No module named xxx & ModuleNotFoundError

Chan hae OH·2023년 9월 21일
0

Spark

목록 보기
10/12

1. 문제 발단


배치 정합성 검증 로직을 적용하고 해당 로그를 저장하기 위해 psycopg2 모듈을 사용할 때 일어났던 일이다.
Pyspark 을 동작 시키는데 ImportError: No module named psycopg2 가 발생했다.



2. 문제 로그


ImportError: No module named psycopg2



3. 문제 원인 분석


  1. YARN 에 Spark job 을 제출하여 DataNode 에 Module 이 설치 되지 않았을 경우

    우선 DataNode 들 마다 psycopg2 모듈 설치한 것을 확인했다.

  2. DataNode 의 Module Path 를 잡지 못하는 경우

    sys.path 경로를 확인했지만 딱히 문제가 없어 보였다.

먼저 각 데이터노드 마다 pyspark shell 을 열어서 psycopg2 를 import 했을 때 잘 됐다.

도무지 갈피가 잡히지 않았다. 그래서 속는셈치고 DataNode 에 psycopg2 module 이 정말 설치가 된건지 find 명령어를 사용하여 확인해본 것이 단서가 됐다.



4. 문제 심층 분석


psycopg2 는 lib64 에 설치가 된다.

지금 환경의 YARN 으로 Spark job 을 제출하게 되면 module 을 찾을 수가 없다고 한다.

다시 sys.path 를 확인해봤을 때 lib64 경로의 site-packages 가 없었다.

그래서 sys.path.append() 를 활용하여 코드 실행 전 경로 부터 추가했다.

그러나 다른 에러가 또 발생했다.

ModuleNotFoundError: No module named psycopg2

이 부분에서 매우 안도 했다. 이제는 모듈 경로를 인식한 것이기 때문이다. 그러나 코드 상에서는 분명 import psycopg2 가 존재했다.

코드는 대략 아래와 같다.

# libs.zip > DB.py 파일
class Postgress:

	def __init__(self):
    	import psycopg2
        ...

Spark submit 은 아래와 같다.

spark-submit --master yarn --deploy-mode cluster --py-files libs.zip main.py

무엇이 문제일까?



5. 문제 해결


아래와 같이 import 를 바깥으로 빼줬더니 psycopg2 모듈을 인식했다.

# libs.zip > DB.py 파일
import psycopg2

class Postgress:

	def __init__(self):
    ...

분명 객체를 생성할 때 psycopg2 를 import 하겠지만, 실제 동작은 그렇지 않았다. 사실 문제는 해결했지만, 어떻게 해결 됐는지 파악하지 못했다. 시간이 조금 생길 때 pyspark 의 코드 인식하는 방식을 찾아볼 필요가 있겠다.



profile
Data Engineer

0개의 댓글