개요
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의 개수를 제한할 수 있다.
'Data > Airflow' 카테고리의 다른 글
[Airflow] EC2 -> EKS 마이그레이션 (0) | 2024.08.01 |
---|---|
[Airflow] DAG CI/CD 구축기 (0) | 2023.06.21 |
[Airflow] 로그 기록 시간대 문제 (0) | 2023.04.05 |
[Airflow] DAG란? (0) | 2022.05.22 |
[Airflow] Apache Airflow 설치하기 (0) | 2022.05.16 |