POST

All
Product
Team
Tech
DocVLM: Make Your VLM an Efficient Reader
  • 최윤진
  1. Tech
Python 3.10 신규 문법 : Parenthesized context managers와 PEG Parser
  • S
    seunghoChoe
  1. Tech
UReader: Universal OCR-free Visually-situated Language Understanding with Multimodal Large Language Model
  • 최윤진
  1. Tech
[팀 소개편] KPMG Lighthouse는 어떤 팀인가요?
  • L
    Lighthouse
  1. Team
[챕터 소개편] Backend Chapter를 소개합니다
  • L
    Lighthouse
  1. Team
[챕터 소개편]Frontend Chapter를 소개합니다
  • L
    Lighthouse
  1. Team
[챕터 소개편] AI Chapter를 소개합니다
  • L
    Lighthouse
  1. Team

Airflow 트러블슈팅 공유

Created by
  • L
    Lighthouse_JSH
Created at
Category
  1. Tech
안녕하세요! 오늘은 제가 Airflow를 사용하면서 겪었던 몇 가지 트러블슈팅 경험을 공유하고자 합니다. 제 경험이 여러분의 Airflow 작업에 도움이 되기를 바랍니다.

디렉토리 구조

제가 구성한 Airflow의 디렉토리 구조는 다음과 같습니다.
airflow ┣ config Airflow 설정 파일을 보관하는 디렉토리 ┣ dags 파이프라인 ┃ ┗ utils ┃ ┣ azure_conn.py # Azure Blob Storage로의 파일 업로드 및 다운로드 기능 구현 ┃ ┗ slack_message.py # Slack으로 알림을 보내는 기능을 구현한 스크립트 ┣ db 데이터베이스 관련 스크립트와 모델을 저장하는 디렉토리 ┣ logs Airflow 작업 로그를 저장하는 디렉토리 ┣ plugins 사용자 정의 plugins을 저장하는 디렉토리. Airflow의 기능 확장에 사용 ┗ temp_directory 임시 파일을 저장하는 디렉토리

추가한 디렉토리에서 import 시 에러 발생

새로운 디렉토리인 config와 db에서 import하려고 시도했을 때 import 오류가 발생했습니다.
이는 프로젝트 경로를 path에 추가하여 해결했습니다.
path를 추가하며 운영 환경과 개발 환경의 경로가 다르기 때문에 다른 문제가 발생했는데 이는 아래에서 다시 설명드리겠습니다.

pluginsdags/utils

처음에는 azure_conn과 slack_message 두 개의 스크립트를 plugins 디렉토리에 저장했습니다.
하지만 GCP Composer 서비스에서는 dags 폴더 하위에 폴더를 생성하도록 권장하기 때문에 코드 재사용성을 위해 두 스크립트를 dags/utils 디렉토리로 이동했습니다.
plugins 디렉토리는 Airflow 시스템의 기본 기능 확장에 사용합니다.

API 호출 에러 사례

스케줄러나 웹 UI를 통해 DAG를 실행할 때 Negsignal.SIGSEGV 오류가 발생하여 requests 호출이 중단되었습니다. 로컬에서 테스트 실행해 보니 문제 없이 동작했지만, 이 오류는 이미 GitHub 디스커션에 등록되어 있었습니다.
# dag 테스트 airflow dags test [dag_id] [execution_date] # dag 내 단일 task 테스트 airflow tasks test [dag_id] [task_id] [execution_date]
원인은 명확하게 밝혀지지 않았지만, macOS에서는 프록시 정보를 가져오는 시스템 호출이 특정 조건 하에서 예상치 못한 방식으로 작동하여 메모리 접근 오류인 SIGSEGV(세그먼테이션 폴트)를 발생시키는 것으로 추측됩니다.
해결방법은 dag에 아래의 코드를 추가해 프록시 설정을 초기화하였습니다.
from _scproxy import _get_proxy_settings _get_proxy_settings()

실행 환경 차이로 인한 코드 불일치

위 에러들로 인해 실행 환경과 개발환경 간 코드가 불일치했습니다.
이를 해결하고자 config/airflow_config/config.json을 두어 실행 환경을 읽어 환경에 따라 같은 코드로 다르게 동작하도록 수정했습니다.

Connections 등록 후 PW를 까먹은 경우

Airflow에서 Connections는 외부 시스템과의 통신을 위해 필요한 메타데이터(예: 데이터베이스, API 서버, 클라우드 서비스 등)를 관리하는 방법입니다.
각 연결 정보는 Airflow의 메타데이터 데이터베이스에 저장되며, Airflow의 다양한 Operator들이 이 정보를 활용하여 필요한 시스템에 접근하고 작업을 수행할 수 있습니다.
보안상 비밀번호는 저장 후 웹상에서 확인할 수 없으나 yaml 파일로 Connections를 추출해 확인 가능합니다.
connection.yaml
airflow connections export connection.yaml

남은 고민거리

실패 재실행

긴 휴가 후 휴가 첫날 발생한 에러로 인해 다음 실행에도 영향이 미치는 것을 확인했습니다.
원인은 temp_directory에 다운받은 xml 파일들이 업로드 실패로 인해 삭제되지 않고 남아있어 다음 날짜부터 키값의 중복으로 인해 업로드가 실패되었기 때문입니다.
이와같은 에러의 발생을 예방하고자 temp_directory 의 하위에 실행일자별로 폴더를 구분하도록 변경했습니다.
또한, API 호출에 필요한 today라는 동적인 날짜를 받는 변수의 경우 task 재실행 시 당일 날짜를 기준으로 삼아 문제가 발생하기에 Airflow의 execution_date라는 특정 실행 일자를 기준으로 하는 매크로를 사용하도록 변경하는 작업을 진행하고자합니다.

마무리

이 글에서는 Airflow를 사용하면서 겪었던 몇 가지 트러블슈팅 경험을 공유했습니다. 제 경험이 여러분의 Airflow 작업에 도움이 되기를 바랍니다.