회사에서 맡은 일 중에 오라클에 있는 디비의 내용을 AWS의 dynamoDB로 옮겨야 하는 일이 있었다.
작은 내용은 람다 – 스텝펑션 조합으로 가능했지만
엄청 많은 양의 데이터를 람다 – 스텝펑션 조합으로는 불가능했다.
그래서 AWS 글루 스튜디오를 쓰기로 결정하면서 결국엔 CX_ORACLE과 연동을 한 삽질기를 기록해본다.
우선 CX_ORACLE을 붙인 이유는 단 한가지이다.
글루 스튜디오에서 oracle을 직접 붙였을 때는 인코딩이 되지 않는다.
회사에서 쓰고 있는 디비는 오라클 + 인코딩은 us-ascii
한글이 필연적으로 깨져서 들어올 수 밖에 없다.
람다에서 오라클 디비의 한글 내용을 가져올 때 cx_oracle 라이브러리를 애용해서
글루에서도 cx_oracle을 쓸 수 밖에 없었다.
우선 제가 작성해 놓은 오라클 인스턴스 19.17파일을 받아서 s3에 올려서 글루에 cx_oracle에 적용해보면 잘 적용이 되는 것을 확인할 수 있다.
https://minshu.duckdns.org/owncloud/index.php/s/jrkUysCEZsbHID0
(워드프레스 파일 용량제한으로 인해 개인 클라우드 공유 링크로 대채합니다.)
우선 오라클을 12c이상을 쓰고 있다면 cx_oracle 의 다음 버전인 python-oracledb에서
별도의 oracle 인스턴스 필요없이 thin모드로 연결이 가능하다고 한다.
회사에서 쓰고 있는 오라클 db가 12c 이하 버전이라
무조건 thick 모드로 연결할 수 밖에 없었다.
글루 스튜디오에서 cx_oracle을 초기화 할 때 아래와 같이 추가 셋팅을 해줘야 한다.
def initCxOracle():
filename = 'oracle_instance_19_17.zip'
oracle_archive = next(Path('/tmp').glob(f'**/{filename}'))
with zipfile.ZipFile(oracle_archive, 'r') as f:
f.extractall('/home/spark/.local/')
cx_Oracle.init_oracle_client(lib_dir=f'/home/spark/.local/lib')

위 사진과 같이 cx_oracle 과 s3에 제가 공유한 파일을 올려서 바라보게 하면 된다.
아래서 부터는 저 zip 파일을 어떻게 만들었는지에 대해 말해보려 한다.
모든 해답은 위 스텍오버플로우 링크에 있다.
우선 AWS GLUE STUDIO에서는 라이브러리를 따로 셋팅할 수 있는 방법이 없다.
그래서 오라클 인스턴스를 다운 받고 위 스텍오버플로우 가이드대로
patchelf로 심링크를 재정의 해주는 것이다.
몇번의 시행착오를 겪었는데 …
cannot open shared object file: No such file or directory
글루를 실행시키면 이런 오류들을 많이 볼 텐데
위 파일을 ldd 명령어를 통해서 라이브러리 의존성을 검색해서
링크 깨진 부분을 patchelf로 다시 재연결해주는 과정을 거쳐서 위의 zip 파일이 생성이 되었다.