목록분류 전체보기 (112)
ㅅㅇ
운영 환경에서 특정 DAG가 장시간 실행되며 CPU와 메모리를 과도하게 점유하면서,다른 도메인의 DAG까지 queued 상태로 밀리는 문제가 발생했습니다. Airflow는 Executor가 허용하는 범위 내에서 가능한 많은 Task를 병렬 실행합니다. 이 과정에서 리소스를 많이 사용하는 Task가 Executor 자리를 선점하면,상대적으로 가벼운 Task도 실행 기회를 얻지 못하는 문제가 발생합니다. 이 문제를 해결하기 위해 Pool을 활용한 논리적 격리 전략을 도입했습니다.Pool 이란 ?Pool은 CPU/RAM과 같은 물리 자원을 격리하는 기능이 아닙니다.대신, Task 실행 개수를 논리적으로 제한하는 제어 장치입니다.“물리적 격리”가 아니라 “논리적 실행 제어”모든 Pool은 동일한 VM 자원을 공..
기존에는 Docker Compose만을 이용하여 로컬에서 Airflow를 실행하고 테스트했습니다.통합 테스트 관점에서는 충분했지만, 실제 로직을 추적하며 디버깅하기에는 불편함이 있었습니다. 특히,breakpoint 사용 불가step-through 디버깅 불가태스크 단위 검증의 번거로움이 문제로 인해 IDE 기반 디버깅 환경의 필요성을 느끼게 되었습니다.그래서 다음과 같이 개발 환경을 이원화하였습니다. 로컬 개발 환경 전략에 대해서 설명 드리고, Airflow Debug 환경 구축 방법에 대해 공유하고자 합니다.Airflow 로컬 실행 환경 전략1. Airflow Debug Test로컬 개발/디버깅 용IDE 디버깅(PyCharm) 사용로컬 Python venv (uv 기반)의 airflow 사용dags t..
List 를 만드는 두 가지 방법 new ArrayList()와 Arrays.asList() 의 차이 1. new ArrayList() ArrayList를 리턴 2. Arrays.asList() Arrays의 정적 클래스인 ArrayList를 리턴 Arrays.asList() 만의 특징 Arrays.asList()는 고정된 List이기 때문에 원소를 추가, 삭제 할 수 없다. list.add() 가 불가능한 것. 변경은 가능하다. import java.util.ArrayList; // new ArrayList() import java.util.Arrays; // Arrays.asList() String[] str = {"1", "2", "3"}; List list = Arrays.asList(str); ..
String 데이터의 경우, 두 가지 방법으로 생성 가능하다. 두 방법은 메모리 저장 방식의 차이가 있다. 1. String 객체 생성 방식 String a = new String(“10”) String b = new String(“10”) // 주소값 비교 -> 값 비교 불가 print(a == b) // False // 값 비교. print(s.equals(b)) // True 생성 시, 메모리 저장 방식 new 키워드로 새로운 객체를 생성하는 것으로, Heap 메모리 영역에 저장 비교 연산자 == 사용 불가. 같은 문자열로 이뤄져 있어도, 참조값이 다르기에 사용 불가하다. 2. String 리터럴 생성 방식 String a = “10”; String b = “10”; // 주소값 비교 -> 데이터 ..
1. Wrapper Class 이란 ? 기본 자료형(Primitive data type)에 대한 객체 표현을 Wrapper class라고 합니다. 2. Boxing 이란? 기본 자료형 → Wrapper class로 변환하는 것 3. UnBoxing Wrapper class → 기본 자료형으로 변환하는 것 4. 기본 타입과 다른 Wrapper Class 자료형만의 특징 이 특징들을 생각하여, 왜 언제 Boxing 하는지 이해하자 불변 객체로 한 번 할당된 객체는 값이 변하지 않는다. ( 수정이나 값을 변경할 때,객체의 값을 변경하는 것이 아니라, 새로운 값의 객체를 new 생성애서 반환하는 하는 것으로 착각하지 말기 ) Null 값을 받을 수 있다. toString() 메소드를 사용하여 문자열로 쉽게 변환..
