← 학습 카테고리

Learn

Airflow

151개 모듈 · 현재 79번째

Airflow 모듈 79/151 airflow-learn-79

Priority Weight — 세 가지 weight_rule과 Pool의 관계

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

이 모듈을 다 읽으면

  • downstream·upstream·absolute 세 weight_rule이 실효 priority_weight를 계산하는 방식의 차이를 설명할 수 있다
  • 각 weight_rule이 어떤 운영 시나리오(여러 Dag run 인스턴스 간의 순서 선호)에 적합한지 판단할 수 있다
  • absolute weight_rule이 대형 Dag에서 갖는 성능상 이점을 설명할 수 있다
  • priority_weight의 정수 범위 제약과 커스텀 weight rule을 등록하는 방법을 설명할 수 있다

priority_weight는 executor 큐 안에서의 우선순위를 정하는 값으로, weight_rule에 따라 태스크의 실효(true) priority_weight가 계산된다. Airflow 기본값인 downstream 룰은 하위 태스크가 많은 상위 태스크의 우선순위를 높여 여러 Dag run이 상위 단계를 먼저 끝내도록 유도하고, upstream 룰은 그 반대이며, absolute 룰은 지정한 값을 그대로 쓰면서 대형 Dag에서 태스크 생성 속도까지 높여준다. 이 값은 Pool과 함께 큐 대기 태스크의 실행 순서를 결정하는 데 쓰인다.

priority_weight와 세 가지 weight_rule

``priority_weight``는 executor 큐 안에서의 우선순위를 정의한다. 기본값은 1이며 임의의 정수로 올릴 수 있고, 숫자가 클수록 우선순위가 높다. 더 나아가 각 태스크는 ``weight_rule``에 따라 계산되는 실효(true) ``priority_weight``를 갖는데, ``weight_rule``은 태스크의 실효 총 우선순위 가중치를 계산하는 데 쓰이는 가중 방법을 정의한다. Airflow의 기본 가중 방법은 ``downstream``이다.

``downstream``에서는 태스크의 실효 가중치가 모든 다운스트림 자손(descendants)의 합계다. 그 결과 업스트림 태스크가 더 높은 가중치를 갖게 되어, 양수 가중치를 쓸 때 더 공격적으로 스케줄링된다. 이는 여러 Dag run 인스턴스가 있을 때, 각 run의 다운스트림 태스크로 넘어가기 전에 모든 run의 업스트림 태스크가 먼저 완료되기를 바랄 때 유용하다.

``upstream``은 그 반대로, 실효 가중치가 모든 업스트림 조상(ancestors)의 합계다. 다운스트림 태스크가 더 높은 가중치를 가지므로 양수 가중치를 쓸 때 더 공격적으로 스케줄링된다. 이는 여러 Dag run 인스턴스가 있을 때, 다른 run들의 업스트림 태스크를 시작하기 전에 각 Dag가 완전히 끝나기를 선호할 때 유용하다.

``absolute``는 추가 가중 없이 지정된 ``priority_weight``를 그대로 실효 가중치로 쓴다. 각 태스크가 가져야 할 정확한 우선순위 가중치를 이미 알고 있을 때 쓰면 되며, 덤으로 매우 큰 Dag에서 태스크 생성 과정의 속도를 상당히 높여주는 효과도 있다(자손·조상을 순회해 합산하는 계산을 건너뛰기 때문).

``priority_weight`` 파라미터는 Pool과 함께 쓰일 수 있다.

핵심 포인트

  • downstream(기본값)은 다운스트림 자손 수의 합을 가중치로 써서 업스트림 태스크를 더 공격적으로 스케줄링하고, 여러 run의 업스트림 단계를 먼저 끝내고 싶을 때 유용하다
  • upstream은 업스트림 조상 수의 합을 가중치로 써서 다운스트림 태스크를 더 공격적으로 스케줄링하고, 각 run을 완전히 끝낸 뒤 다음 run의 업스트림을 시작하고 싶을 때 유용하다
  • absolute는 지정한 priority_weight를 그대로 쓰며, 자손/조상 합산 계산을 생략하므로 대형 Dag에서 태스크 생성 속도가 크게 빨라지는 부수 효과가 있다

정수 범위 제약과 커스텀 Weight Rule

대부분의 DB 엔진이 정수에 32비트를 쓰기 때문에, 계산되거나 지정된 ``priority_weight``의 최댓값은 2,147,483,647이고 최솟값은 -2,147,483,648이다.

2.9.0부터는 ``PriorityWeightStrategy`` 클래스를 확장하고 플러그인에 등록하는 방식으로 자신만의 커스텀 가중 방법을 구현할 수 있다. 커스텀 가중 전략이 이미 Airflow에 등록되어 있는지는 ``airflow plugins`` bash 명령으로 확인할 수 있다. 등록한 뒤에는 커스텀 클래스의 인스턴스를 만들어 태스크의 ``weight_rule`` 파라미터에 제공하거나, 그 커스텀 클래스의 경로 문자열을 제공해 사용할 수 있다. Dag가 실행된 뒤에는 태스크의 ``priority_weight`` 파라미터를 확인해 커스텀 우선순위 전략이 실제로 쓰이고 있는지 검증할 수 있다. 이 기능은 실험적(experimental)이다.

핵심 포인트

  • 대부분 DB 엔진의 32비트 정수 제약으로 priority_weight의 유효 범위는 -2,147,483,648 ~ 2,147,483,647이다
  • 2.9.0부터 PriorityWeightStrategy를 확장해 플러그인으로 등록하면 커스텀 weight_rule을 만들 수 있으며, 이 기능은 실험적 기능으로 표시되어 있다