Share
Sign In
Lighthouse Dev
Airflow 트러블슈팅 공유
L
Lighthouse_JSH
👍
안녕하세요! 오늘은 제가 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 작업에 도움이 되기를 바랍니다.
Kp
Subscribe to 'kpmg-lighthouse'
Welcome to 'kpmg-lighthouse'!
By subscribing to my site, you'll be the first to receive notifications and emails about the latest updates, including new posts.
Join SlashPage and subscribe to 'kpmg-lighthouse'!
Subscribe
👍
Lighthouse
LAM 로깅 및 모니터링 시스템
Lighthouse에서 개발되는 모든 Product 모니터링 시스템을 갖춥니다. 모니터링이 필요한 부분은 잘 아시다 시피 시스템 영역 그리고 사용자 영역으로 구분될 수 있지요. 시스템 영역에서는 서버 상태, 데이터베이스 성능, 네트워크 트래픽, API 응답 시간 등을 실시간으로 모니터링하여 장애 발생 시 신속하게 대응할 수 있도록 합니다. 이를 통해 가용성, 신뢰성, 성능 등을 지속적으로 최적화하며, 문제 발생 시 그 원인을 빠르게 파악하고 해결할 수 있는 환경을 조성합니다. 또한 로그 분석 및 자동 알림 기능을 통해 예측 가능한 문제를 미리 식별하고 사전에 대응할 수 있도록 합니다. 사용자 영역에서는 사용자 행동 분석, 사용 패턴 추적, 인터페이스 반응 시간 등을 모니터링하여 사용자 경험(UX)을 극대화하는 데 중점을 둡니다. 이를 통해 사용자의 요구를 정확히 이해하고, 서비스 개선을 위한 데이터를 축적할 수 있습니다. 사용자의 피드백을 실시간으로 수집하고 분석하여, 즉각적인 조치와 더불어 장기적인 발전 계획에 반영합니다. 이와 같은 모니터링 시스템은 제품의 전체적인 품질 향상은 물론, 비즈니스 목표 달성에도 크게 기여할 것입니다. Kibana의 강력한 시각화 도구를 활용해, 이러한 데이터를 직관적이고 이해하기 쉬운 형태로 제공함으로써, 제품 개발 및 개선에 필요한 핵심 인사이트를 얻을 수 있습니다. 또한, 사용자 피드백을 자동으로 수집하고 분석하여, 제품에 대한 사용자의 반응을 실시간으로 파악하고 즉각적으로 대응할 수 있는 체계를 갖춥니다.
김원준
Python의 Decorator
0. 들어가며 이번 시간에는, 파이썬의 데코레이터에 대해서 발표해보도록 하겠다. 1. Decorator 란? 파이썬을 사용하다보면, 함수 혹은 메서드 위에 “@” 골뱅이가 붙은 특이한 이름을 본 적이 있을 것이다. 이러한 특이한 문법을 decorator라고 하는데, 영어 사전에서 decorator는 “장식자”이라는 뜻을 가지고 있다. 파이썬의 decorator 역시 동일한 의미로 사용된다. 어떤 함수가 있을 때, 해당 함수를 직접 수정하지 않고, 함수에 기능을 추가 /변경 / 확장 하고자 할 때 decorator를 사용한다. decorator는 함수를 인자로 받고, 또 다른 함수를 반환하는 고차함수 이다. 고차함수 ? 함수를 인자로 받아서, 함수를 반환하는 함수 파이썬에서 함수는 일급 객체로 취급되기 때문에 가능하다. 일급객체 ? → 아래에서 살펴보자. 그렇다면, 도대체 어떤 기능 이길래 추가 /변경 / 확장 모두 가능한 것일까? 지금부터 알아보자. 1.1. 데코레이터 기본 예시
😀👍🏻
2
donggyun_woo
SQLAlchemy 알아보기
시작 하면서 최근 KRM ver2.0 프로젝트를 시작하면서 웹서버를 구현하기 위해 SQLAlchemy를 사용하면서 모델링을 했습니다. 작업을 하면서 SQLAlchemy에 대해 공부한 내용을 공유해 보겠습니다. SQLAlchemy? SQLAlchemy는 파이썬을 위한 SQL 툴킷 및 Object-Relational Mapping(ORM) 라이브러리로, 데이터베이스와의 상호작용을 보다 쉽고 직관적으로 할 수 있게 도와줍니다. SQLAlchemy는 데이터베이스 연결 관리, 트랜잭션 관리, 스키마 정의 및 관리 등 다양한 기능을 제공합니다. SQLAlchemy 구조 크게 Core와 ORM으로 나뉘어져 있습니다. Core (SQL Expression Language): SQLAlchemy의 Core는 SQL 표현 언어를 사용하여 데이터베이스 쿼리를 생성하고 실행하는 데 중점을 둡니다. SQLAlchemy Core는 SQL을 직접 작성하고 데이터베이스와 상호작용할 수 있는 저수준 인터페이스를 제공합니다. Engine 데이터베이스와의 연결을 관리하는 핵심 구성 요소입니다. Engine 객체는 데이터베이스와의 상호작용을 위한 연결 풀(Connection Pool) 및 데이터베이스 드라이버를 포함하여 SQLAlchemy의 다른 부분과의 통신을 조정 Engine의 주요 기능 데이터베이스 연결 설정: Engine은 데이터베이스 URL을 통해 데이터베이스 연결 정보를 설정합니다. 연결 풀 관리: Engine은 연결 풀을 관리하여 데이터베이스 연결의 효율성을 높이고 성능을 최적화합니다. 연결 풀은 데이터베이스 연결을 재사용하여 연결 생성 및 소멸에 따른 오버헤드를 줄입니다. 트랜잭션 관리:
👍🏻
1