Airflow CeleryExecutor와 공유스토리지

스르륵·2022년 9월 27일
0

CeleryExecutor 구성과 어려움

최근 Airflow에서 CeleryExecutor를 사용하면서 공유 스토리지를 사용할 필요가 생겼다. 3개의 노드로 구성된 클러스터를 만들어 사용하는데, 각 태스크 간의 데이터 전달을 위해 파일을 떨어뜨려 읽어오는 방식을 선택했기 때문이다.

Airflow가 ETL을 위한 것은 아니지만 파이썬으로 진행한 ETL을 오케스트레이션 하도록 했기 때문에 불가피하게 대용량의 데이터를 전달할 필요가 생겼다.

처음 CeleryExecutor에서 에러를 뱉을 때는 원인을 파악하지 못했고 일주일 정도는 헤맨 것 같다. 허무하게도 에러의 원인을 찾지 못한 이유는 Airflow WebUI에서 나오는 에러와 실제 에러가 다르다는 것을 몰랐기 때문이었다. WebUI에서 나오는 에러는 워커노드의 로그를 가져오지 못했다는 것이어서 그 부분에 집중해서 조사했지만 해결될 기미가 없었다. 하지만 어이없게도 가져오지 못한다는 로그 파일을 직접 열어보니 거기에 진짜 에러가 있더라..
로컬에 저장한 파일이 다음 task에서 다른 워커에서 실행되면 해당 파일을 읽어올 수 없기 때문에 생긴 에러였다.

나처럼 각 task간의 파일을 공유해야하는 일이 없지는 않는 것 같았다. S3서비스를 통해 공유하는 방법을 찾았지만 내가 구성할 환경은 폐쇄망인지라 퍼블릭 클라우드 서비스를 이용할 수 없었다. 하지만 이런 내용을 PM님과 공유하다보니 자연스럽게 그러면 공유풀을 써라 라고 하셔서 아차 싶었다...
사실 이번 일을 해결하는데 오래 걸린 이유는 단순히 내가 에러를 못찾아서였다ㅋㅋ 막상 원인을 찾고나니 해결하는데에는 몇 시간 걸리지도 않은 것 같다.

리눅스 공유 스토리지

해결책을 강구한 후 공유 스토리지로 해결이 가능한 지 테스트를 해봐야 했다. 실제 운영 환경에서는 공유 볼륨을 요청하면 붙여줄테니 그걸 사용만 하면 되는데 테스트도 도움을 받아야하나 싶다가 직접 해봤다. 그냥 마운트만 하면되는거 아닌가 싶은 생각이었다.
참조 링크

NFS 서버

Network Fiel System으로 유닉스 계열 시스템의 기본 파일 공유 형태이다. 써본 적 없는 것 같아도 윈도우의 네트워크 드라이브랑 유사한게 아닐까 생각한다. Airflow를 사용하는 인스턴스들 외에 새로운 인스턴스에 폴더를 하나 만들고 해당 인스턴스에서 NFS서버를 실행시켰다.

공유폴더를 생성하고 모든 사용자가 읽기, 쓰기가 가능해야하기 때문에 권한도 수정해주었다. 그리고 이 폴더를 누구와 공유할지 설정해준다.

에시로 작성한 부분이고 공유할 디렉토리와 공유할 대상을 쓰면 된다.
그리고 괄호를 붙여서 옵션을 넣을 수 있는데

  • rw
  • ro
  • root_squash
  • sec=[opt]

등이 있었다.

그다음 systemctl start nfs-server로 실행시키면 서버 작업은 끝

클라이언트에서 마운트하기

자동 마운트설정도 있다고 하는데, 나는 3 대만 하면 되므로 직접 mount 명령어를 통해 연결해줬다.

-t : 파일시스템 타입 선택
-o : 마운트 옵션을 사용, 콤마를 기준으로 여러 옵션 넣어주면 됨
mount 옵션 참고

CeleryExecutor 동작 확인?


깔끔하게 실행 성공
이전에는 task가 어떤 워커에 배정되냐 운빨로 실행 되고 일치하지 않으면 실패해버렸으나 공유 스토리지 사용으로 성공!


사실 이번 CeleryExecutor 문제는 기술적으로 어려웠다거나 복잡한 것이 있었다기 보다는 에러를 못읽어서 그런 것이었다. WebUI에서 나오는 에러와 워커의 에러가 다를 거라고 생각을 안하고 로그를 fetch 못한다길래 그 로그가 존재 하는지만 확인하고 읽어볼 생각을안했다. 이런 간단한 일로 일주일을 끌었다는게 아쉬었다.

또 다른 노드의 파일을 읽어올 수 없다는 원인을 파악한 후에도 서로 간의 파일 공유를 어떻게 하지? 라는 문제에 대해서는 경험 많은 분의 조언으로 쉽게 해결할 수 있었다. 공유 스토리지를 전에 써본적은 있지만 나혼자서 생각해낼 수 있었을까 싶긴 하다. S3에서 힌트를 얻어서 해결했더라도 훨씬 오래 걸렸을 것이다.

profile
기록하는 블로그

0개의 댓글