Data/Airflow

[Airflow] Airflow 성능 관련 설정 값 정리

멍이요 2023. 12. 19. 12:25

개요

Airflow 의 성능을 높이기 위해서 설정 해야 하는 여러 가지 옵션들이 있다. airflow.cfg 파일에서 사용할 수 있는 해당 옵션들에 대해서 알아보고 정리하는 시간을 가져보려고 한다.

Airflow 환경 Level


[core]

parallelism

Airflow 환경 내에서 동시에 실행할 수 있는 최대 Task의 수 이다. 예를 들어 32로 설정되어 있다면 Airflow 환경 내에서 동시에 실행될 수 있는 Task의 수는 최대 32개라는 뜻이다.

(default : 32)

max_active_tasks_per_dag

DAG당 한 번에 스케줄링되는 최대 Task의 수를 결정한다. 즉, 하나의 DAG에서 동시에 실행될 수 있는 Task의 수를 말한다.

(default :16)

Airflow에 사용할 수 있는 리소스(celery worker or kubernetes 리소스)의 수를 늘렸는데 Task가 늘린 수 만큼 실행되지 않는 경우, parallelism 및 max_active_tasks_per_dag의 값도 증가시켜야 한다.

max_active_runs_per_dag

Airflow Scheduler가 주어신 시간에 생성할 수 있는 활성화된 DagRun의 최대 수를 결정한다. 간단하게 말해서 하나의 DAG 안에서 최대 활성화되는 DAG의 수를 제어하는 값이다.

(default : 16)

dag_file_processor_timeout

DAG 파일을 처리 하는 DagFileProcessor가 시간 초과 되기 전에 실행할 수 있는 시간이다.

(default : 50)

dagbag_import_timeout

DAG 개체를 가져올 수 있는 dagbag 시간이며 dag_file_processor_timeout에 설정된 값보다 낮아야 한다.

(default : 30)

DAG 처리 로그에 timeout이 표시되거나 DAG가 DAG 목록에 모두 표시되지 않으면 이 값을 늘려보면 된다. Task가 실행될 때, Worker는 dagbag을 채워야 하므로 만약 Task가 실행되지 않는 경우 이 값을 늘려 해결할 수도 있다.

[scheduler]

min_file_process_interval

각 DAG 파일은 min_file_process_interval 초 단위로 구문 분석된다. DAG에 대한 업데이트는 설정된 해당 값 이후에 반영된다. 해당 설정값이 낮으면 스케줄러의 CPU 사용량이 증가한다. 복잡한 코드로 생성된 동적 DAG가 있는 경우 스케줄러 성능에 부정적인 영향을 미치지 않도록 이 값을 늘릴 수 있다.

(default : 30)

dag_dir_list_interval

DAG directory에서 새 파일을 검색하는 빈도이다. 값이 낮을수록 새 DAG가 더 빨리 처리되지만 스케줄러의 CPU 사용량이 높아진다.

(default : 300)

min_file_process_interval과 dag_dir_list_interval 중 어떤 값을 선택할 지 알기 위해서 DAG를 구문 분석하는 데 걸리는 시간(dag_processing.total_parse_time)을 알면 도움이 된다. dag_dir_list_interval이 각 DAG를 구문 분석하는 데 걸리는 시간보다 짧으면 성능 문제가 발생할 수 있다.

parsing_processes

스케줄러는 DAG를 구문 분석하기 위해 여러 프로세스를 병렬로 실행할 수 있다. 이 설정은 병렬로 실행할 수 있는 프로세스의 수를 정의한다. 사용 가능한 vCPU의 2배 값을 설정하는 것이 좋다. 이 값을 늘리면 DAG가 많은 경우 DAG를 보다 효율적으로 직렬화할 수 있다. 여러 스케줄러를 실행하는 경우 이 값이 각각 적용된다.

(default : 2)

file_parsing_sort_mode

스케줄러가 구문 분석 순서를 결정하기 위해 DAG 파일을 나열하고 정렬하는 방법을 결정한다. modified_time, random_seeded_by_host, alphabetical 중 하나로 설정한다.

(default : modified_time)

scheduler_heartbeat_sec

새 작업을 트리거하기 위해 스케줄러를 실행해야 하는 빈도를 정의한다. schduler가 새로운 task를 찾는데 대기하는 시간으로 해당 값이 크다면 airflow UI에서 아래와 같은 화면을 볼 수도 있다.

(default : 5)

max_dagruns_to_create_per_loop

스케줄러 loop당 생성할 DagRun의 최대 수이다. 이 값을 줄여 task 예약을 위한 리소스를 확보할 수 있다.

(default : 10)

max_tis_per_query

loop에서 메타스토어에 대한 쿼리의 배치 크기를 변경한다. 값이 높으면 tis 쿼리 당 더 많이 처리할 수 있지만 쿼리가 너무 복잡해지고 성능 병목 현상이 발생할 수 있다.

(default : 512)

DAG Level


DAG Level에서의 설정은 특정 DAG에만 적용되며 DAG 코드에 정의된다. DAG Level과 환경 Level 둘 다에 설정이 있는 경우 DAG Level의 설정이 우선된다.

max_active_runs

DAG에 허용되는 활성 DagRun의 최대 수이다. 설정한 값 이상으로 스케줄러는 새로운 활성 DagRun을 생성하지 않는다. 이 설정이 정의되지 않은 경우 airflow 환경 설정 값인 max_active_runs_per_dag가 적용된다.

DAG를 사용하는 backfill의 경우 실수로 많은 수의 DAG 실행을 트리거하지 않도록 이 매개변수를 저의하는 것이 좋다. 또한, DAG에서 catchup을 사용하여 backfill을 할 때, 너무 많은 DAG가 실행되지 않도록 해당 값을 설정하는 것이 좋다.

max_active_tasks

하나의 DAG가 실행될 때 동시에 실행할 수 있는 총 Task의 수이다. DAG 내에서 병렬 처리를 제어한다. 이 설정이 정의되지 않은 경우 airflow 환경 설정값인 max_active_tasks_per_dag 가 적용된다.

concurrency

모든 DagRun에서 동시에 실행할 수 있는 최대 Task 인스턴스 수이다. 이 설정이 정의되지 않은 경우 airflow 환경 설정값인 max_active_tasks_per_dag가 적용된다.

Task Level


Task Level에서의 설정은 Task Operator에서 정의되며 성능에 대한 세부적인 제어를 할 수 있다.

max_active_tis_per_dag

동일한 Task가 모든 DagRun에서 동시에 실행할 수 있는 최대 횟수이다. 예를 들어 작업이 데이터 테이블과 같이 한 번에 여러 작업에서 수정해서는 안되는 경우 이 값을 1로 설정해 조절할 수 있다.

pool

Task에서 사용할 수 있는 pool의 사이즈를 정의한다. pool은 임의의 Task Group의 동시 인스턴스 수를 제한하는 방법이다. 이 설정은 많은 Worker 또는 DAG가 병렬로 실행되지만 API 속도 제한을 피하려고 할 때 유용하다.

Celery Executor


Celery Executor를 사용할 때 성능 튜닝

worker_concurrency

각 Worker Node 에서 실행되는 Worker Process 의 수이다. 각 Celery Worker는 Task를 수행하는 Worker Process를 Pool 처럼 미리 띄워놓는다. 이를 통해 각 Worker 노드에서 동시에 실행되는 Task의 개수를 제한할 수 있다.