반응형
Airflow를 이용한 oracle batch job을 개발 중, cx_Oracle을 인식하지 못하는 현상이 발생하였다. 결론적으로는 매우 어이없는 실수지만, 동일한 이슈를 겪는 사람들이 분명 있을 것으로 생각하여 해결 과정을 정리하고자 한다.
문제
- 기존 postgresql 관련된 dag만 존재하던 airflow에 Oracle 관련 job을 추가하였다.
- Airflow 스케줄러에서 cx_Oracle을 호출하여, connection을 시도하니, 아래와 같은 오류가 발생하였다.
cx_oracle.databaseerror: dpi-1047: cannot locate a 64-bit oracle client library: "libclntsh.so: cannot open shared object file: no such file or directory". see https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help |
- 실제 instantclient에 들어가봤을 때, libclntsh.so 파일이 존재하였다.
개발 환경
- 문제가 발생한 상황은 centos 7버전에 conda 가상환경을 통해, airflow shcheduler를 수행하고 있었고, 모니터링의 편의를 위해 tmux로 shceduler와 webserber를 각각 다른 터미널로 수행 중이었다.
해결 시도
- 해당 에러를 과거에도 경험해본 적이 있는데, 환경 변수 PATH에 instantclient의 경로가 인지되지 않아, 발생하는 문제이다.
- ~/. bashrc에 경로를 잡아주고, source ~/. bashrc를 통해 환경 변수를 적용해 준다.
vim ~/.bashrc
######## .bashrc 마지막 줄 추가 #######
export ORACLE_HOME=”/home/user/{instatclient 위치}″
export LD_LIBRARY_PATH=”$ORACLE_HOME”
#######################################
source ~/.bashrc
- python으로 connection을 실험해주니, 정상적으로 연결이 된다. 하지만, airflow scheduler 안에서는 계속 같은 이슈가 발생하였다.
해결 방법
- 너무나 당연한 내용이지만, source ~/.bashrc를 적용한 터미널과 상관없이, airflow의 scheduler와 webserver가 구동 중인 터미널에는 변경된 bashrc의 내용이 적용되지 않았다.
- . bashrc는 터미널이 시작될 때, 적용되는데,. bashrc 수정 전에 tmux로 생성한, airflow의 scheduler와 webserver 관련 터미널들은 변경된. bashrc를 적용하지 않았기 때문에, 당연히 instantclient의 경로를 인지하지 못하고, 경로를 못 찾는 이슈가 계속 발생한 것이다.
- scheduler와 webserver를 종료하고, 각 터미널에서 source ~/.bashrc를 적용해 준 후, scheduler와 webserver를 각각 재시작하니, 정상적으로 cx_Oracle을 통한 connection이 가능하였다.
- 지금 생각하니, 매우 당연한 내용이지만, 이유를 찾지 못해 한참을 고생했다. 아직 scheduler에 실시간성 스케줄링이 필요한 내용이 없어서 scheduler 종료 후, 시작이 가능하였지만, 운영 중인 환경에서는 어려울 것 같다. 이런 경우에는, cx_Oracle이 필요한 dag 안에서 cx_Oracle을 통한 connection 전에 시스템 환경 변수를 넣어주는 과정으로 해결 가능하다.
import os
current_path = os.environ.get('PATH', '')
new_path = 'instantclient 경로'
if new_path not in current_path:
updated_path = f"{current_path}:{new_path}"
os.environ['PATH'] = updated_path
'Linux' 카테고리의 다른 글
[이슈 해결] SSH 접속이 갑자기 느려졌을 때 해결 방법 (50) | 2023.11.20 |
---|