배치 정합성 검증 로직을 적용하고 해당 로그를 저장하기 위해 psycopg2 모듈을 사용할 때 일어났던 일이다.
Pyspark 을 동작 시키는데 ImportError: No module named psycopg2 가 발생했다.
ImportError: No module named psycopg2
YARN 에 Spark job 을 제출하여 DataNode 에 Module 이 설치 되지 않았을 경우
우선 DataNode 들 마다 psycopg2 모듈 설치한 것을 확인했다.
DataNode 의 Module Path 를 잡지 못하는 경우
sys.path 경로를 확인했지만 딱히 문제가 없어 보였다.
먼저 각 데이터노드 마다 pyspark shell 을 열어서 psycopg2 를 import 했을 때 잘 됐다.
도무지 갈피가 잡히지 않았다. 그래서 속는셈치고 DataNode 에 psycopg2 module 이 정말 설치가 된건지 find 명령어를 사용하여 확인해본 것이 단서가 됐다.
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
무엇이 문제일까?
아래와 같이 import 를 바깥으로 빼줬더니 psycopg2 모듈을 인식했다.
# libs.zip > DB.py 파일
import psycopg2
class Postgress:
def __init__(self):
...
분명 객체를 생성할 때 psycopg2 를 import 하겠지만, 실제 동작은 그렇지 않았다. 사실 문제는 해결했지만, 어떻게 해결 됐는지 파악하지 못했다. 시간이 조금 생길 때 pyspark 의 코드 인식하는 방식을 찾아볼 필요가 있겠다.