← 학습 카테고리

Learn

Airflow

151개 모듈 · 현재 78번째

Airflow 모듈 78/151 airflow-learn-78

Pools — 실행 병렬성 제한과 pool_slots

Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation administration-and-deployment/pools.rst (전체)

이 모듈을 다 읽으면

  • Pool이 무엇을 제한하는 메커니즘인지, default_pool의 특성(슬롯 수, 제거 불가)을 설명할 수 있다
  • pool_slots로 태스크별 '계산 가중치'를 다르게 부여했을 때 슬롯 점유가 어떻게 계산되는지 설명할 수 있다
  • 슬롯이 여유가 생겼을 때 대기 중인 태스크가 어떤 기준으로 실행되는지(priority_weight와의 관계) 설명할 수 있다

Pool은 임의의 태스크 집합에 대해 실행 병렬성을 제한하는 메커니즘으로, 다운스트림 시스템이 동시에 너무 많은 요청을 받아 과부하되는 것을 막는 데 쓰인다. 태스크는 기본 1 pool_slot을 점유하지만 pool_slots 인자로 더 많은 슬롯을 점유하도록 설정해 '무거운' 태스크가 여러 '가벼운' 태스크만큼의 자원을 쓰도록 표현할 수 있다.

Pool의 목적과 기본 동작

일부 시스템은 너무 많은 프로세스가 동시에 접근하면 과부하될 수 있다. Airflow Pool은 임의의 태스크 집합에 대해 실행 병렬성을 제한하는 데 쓸 수 있다. Pool 목록은 UI(Menu -> Admin -> Pools)에서 관리되며, 이름을 붙이고 워커 슬롯 수를 할당한다. 여기서 지연된(deferred) 태스크를 점유 슬롯 계산에 포함할지도 결정할 수 있다.

태스크는 생성 시 ``pool`` 파라미터로 기존 Pool 중 하나와 연결할 수 있다. 태스크는 슬롯이 찰 때까지 평소대로 스케줄링되고, 태스크가 점유하는 슬롯 수는 ``pool_slots``로 설정할 수 있다. 용량이 다 차면 실행 가능한 태스크는 큐에 쌓이고 UI에도 그렇게 표시된다. 슬롯이 비면, 큐에 쌓인 태스크는 그 태스크와 하위 태스크들의 ``priority_weight``에 기반해 실행되기 시작한다.

Pool이 지정되지 않은 태스크는 기본 Pool인 ``default_pool``에 배정되며, 이 Pool은 128개 슬롯으로 초기화되고 UI나 CLI로 수정할 수 있지만 제거할 수는 없다.

핵심 포인트

  • Pool은 UI(Admin -> Pools)에서 이름·슬롯 수를 관리하며, deferred 태스크를 점유 슬롯 계산에 포함할지도 옵션으로 설정할 수 있다
  • Pool이 지정되지 않은 태스크는 128슬롯짜리 default_pool에 배정되며, 이 Pool은 수정은 가능하지만 삭제할 수 없다
  • 슬롯이 비었을 때 큐에 쌓인 태스크 중 무엇을 먼저 실행할지는 해당 태스크와 하위 태스크들의 priority_weight로 결정된다

pool_slots로 태스크별 '계산 가중치' 표현하기

Airflow 태스크는 기본적으로 각각 하나의 Pool 슬롯을 점유하지만, 필요하다면 ``pool_slots`` 인자로 더 많은 슬롯을 점유하도록 설정할 수 있다. 이는 같은 Pool에 속한 여러 태스크가 서로 동일한 '계산 가중치'를 갖지 않을 때 특히 유용하다.

예를 들어 슬롯이 2개인 Pool ``maintenance``(``Pool(pool='maintenance', slots=2)``)와, ``pool_slots=2``인 ``heavy_task``, 각각 ``pool_slots=1``인 ``light_task1``·``light_task2``가 있다고 하자. ``heavy_task``는 2슬롯을 쓰도록 설정되어 있어 실행되는 동안 Pool 전체를 소진한다. 따라서 가벼운 태스크들은 ``heavy_task``가 끝날 때까지 큐에서 기다려야 한다 — 여기서 ``heavy_task``는 자원 사용 측면에서 가벼운 태스크 2개가 동시에 도는 것과 동등하다고 볼 수 있다.

이 방식은 무겁고 가벼운 태스크가 동시에 돌 때(이 예시에서 그렇게 되면) 시스템 자원이 과부하될 수 있는 상황을 막아준다. 반대로 두 가벼운 태스크는 각각 1슬롯만 점유하므로 서로 동시에 실행될 수 있는 반면, 무거운 태스크는 2슬롯이 함께 비어야만 실행될 수 있다.

핵심 포인트

  • pool_slots는 태스크 기본값 1에서 늘려 '무거운' 태스크가 여러 슬롯을 점유하도록 표현할 수 있다
  • 예시에서 pool_slots=2인 heavy_task는 slots=2인 Pool을 혼자 소진하므로, 실행 중에는 pool_slots=1인 light_task들이 큐에서 대기해야 한다
  • 가벼운 태스크끼리는 각자 1슬롯만 쓰므로 동시 실행 가능하지만, 무거운 태스크는 그만큼의 슬롯이 한꺼번에 비어야 실행된다