Data Engineering/Airflow

[Airflow 가이드 ep.5] 1부 개념과 설정 #5 | Airflow 기본 설정값 airflow.cfg 완전 해부

ygtoken 2025. 3. 25. 15:46
728x90

이 글에서는 Airflow의 핵심 구성 파일인 airflow.cfg를 심층적으로 분석합니다. 각 섹션별 중요 설정 옵션들을 살펴보고, 실무에서 자주 수정하게 되는 설정들과 성능 최적화를 위한 팁을 알아봅니다. 초보자도 이해할 수 있는 설명과 함께 실제 운영 환경에서 활용할 수 있는 구체적인 예시를 제공합니다.


📌 airflow.cfg 개요

airflow.cfg 파일이란?

airflow.cfg는 Airflow의 모든 구성 요소와 동작 방식을 정의하는 중앙 설정 파일입니다. Airflow를 처음 초기화할 때 자동으로 생성되며, 기본적으로 $AIRFLOW_HOME 디렉토리 아래에 위치합니다.

# airflow.cfg 파일 위치 확인
ls -la $AIRFLOW_HOME/airflow.cfg

# 또는 다음 명령으로 현재 설정 파일 위치 확인
airflow config get-value core config_file_path

 

설정 파일의 구성

airflow.cfg 파일은 여러 섹션으로 구분되어 있으며, 각 섹션은 Airflow의 특정 구성 요소나 기능과 관련된 설정들을 포함합니다.

 

airflow.cfg 주요 섹션 구조도

 

# airflow.cfg 기본 구조 예시
[core]
# 핵심 설정

[api]
# API 관련 설정

[webserver]
# 웹 서버 관련 설정

[scheduler]
# 스케줄러 관련 설정

# 기타 섹션들...

 

환경 변수를 통한 설정 오버라이드

airflow.cfg 파일의 모든 설정은 환경 변수를 통해 오버라이드할 수 있습니다. 이는 특히 Docker나 Kubernetes 환경에서 유용합니다.

# 환경 변수 명명 규칙:
# AIRFLOW__<섹션>__<설정_키>

# 예: core 섹션의 executor 설정 오버라이드
export AIRFLOW__CORE__EXECUTOR=LocalExecutor

# 예: webserver 섹션의 web_server_port 설정 오버라이드
export AIRFLOW__WEBSERVER__WEB_SERVER_PORT=8080

 

설정 확인 방법

현재 적용된 설정을 확인하는 방법은 다음과 같습니다:

# 특정 설정 값 확인
airflow config get-value core executor

# 전체 설정 목록 확인
airflow config list

# 특정 섹션의 모든 설정 확인
airflow config list --section scheduler

 

Airflow 설정 구성의 계층 구조

 


📌 [core] 섹션: 핵심 설정

기본 디렉토리 및 경로 설정

# 기본 디렉토리 설정
[core]
# Airflow 홈 디렉토리 - 모든 파일 및 디렉토리의 기본 경로
# 설정하지 않으면 기본값은 ~/airflow가 됨
airflow_home = /path/to/airflow

# DAG 파일 위치 - Python으로 작성된 DAG 정의 파일들이 저장되는 디렉토리
# Airflow는 이 디렉토리를 주기적으로 스캔하여 DAG를 찾음
dags_folder = /path/to/airflow/dags

# 로그 파일 저장 위치 - 각 태스크 실행의 로그가 저장됨
base_log_folder = /path/to/airflow/logs

# 플러그인 디렉토리 - 사용자 정의 플러그인이 저장됨
plugins_folder = /path/to/airflow/plugins

 

데이터베이스 설정

[core]
# SQL Alchemy 연결 문자열 - Airflow 메타데이터를 저장할 데이터베이스 지정
# SQLite (개발/테스트용, 기본값)
sql_alchemy_conn = sqlite:////path/to/airflow/airflow.db

# PostgreSQL (권장, 프로덕션용)
# sql_alchemy_conn = postgresql+psycopg2://airflow:airflow@postgres:5432/airflow

# MySQL
# sql_alchemy_conn = mysql://airflow:airflow@mysql:3306/airflow

# 데이터베이스 연결 풀 크기 - 동시에 유지할 DB 연결 수
sql_alchemy_pool_size = 5

# 연결 재활용 시간(초) - 지정 시간 경과 후 연결 재설정
sql_alchemy_pool_recycle = 1800

# 최대 연결 초과 수 - pool_size를 초과하여 생성할 수 있는 최대 연결 수
sql_alchemy_max_overflow = 10

 

Executor 설정

[core]
# Executor - 태스크 실행 방식 결정
# SequentialExecutor: 단일 프로세스, 순차 실행 (개발용, SQLite와 함께 사용)
# LocalExecutor: 로컬 환경에서 병렬 실행
# CeleryExecutor: 분산 환경에서 Celery를 통한 실행
# KubernetesExecutor: Kubernetes Pod에서 태스크 실행
executor = SequentialExecutor

# 병렬성 설정 - 동시에 실행할 수 있는 최대 태스크 수
# 0으로 설정하면 제한 없음 (시스템 리소스가 허용하는 한)
parallelism = 32

# DAG별 동시 실행 가능한 최대 태스크 수
# 특정 DAG가 모든 리소스를 독점하는 것을 방지
max_active_tasks_per_dag = 16

# 태스크별 최대 실행 시간(초) - 이 시간을 초과하면 태스크가 종료됨
task_execution_timeout = 300

 

보안 설정

[core]
# Fernet 키 - 연결 비밀번호 등 민감 정보 암호화에 사용
# python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"로 생성
fernet_key = YourGeneratedFernetKey

# 웹 서버 인증 설정
authenticate = True
auth_backend = airflow.api.auth.backend.basic_auth

# 기본 태스크 권한 설정 - Unix 파일 권한 형식
default_task_execution_timeout = 300

 

기타 핵심 설정

[core]
# DAG 실행 캐치업 기본값 - True면 start_date부터 현재까지 누락된 실행을 따라잡음
catchup_by_default = True

# 로드할 예제 DAG - 초기 학습용, 프로덕션에서는 False로 설정 권장
load_examples = True

# 기본 시간대 설정 - 전역 시간대 설정(개별 DAG 설정도 가능)
default_timezone = UTC

# DAG 직렬화 - 성능 향상을 위한 설정(2.0 이상에서 권장)
store_serialized_dags = True
min_serialized_dag_update_interval = 30

📌 [webserver] 섹션: 웹 서버 설정

기본 웹 서버 설정

[webserver]
# 웹 서버 기본 설정
# 바인딩할 주소 - 0.0.0.0은 모든 인터페이스에서 접근 가능
web_server_host = 0.0.0.0

# 웹 서버 포트 - UI 접속 시 사용할 포트
web_server_port = 8080

# 웹 서버 워커 수 - 동시 처리할 수 있는 요청 수
workers = 4

# 워커 클래스 - sync(동기), eventlet, gevent, tornado 등
worker_class = sync

# 웹 서버 타임아웃(초) - 응답 없을 시 연결 종료 시간
web_server_timeout = 120

 

인증 및 보안 설정

[webserver]
# 인증 설정
authenticate = True

# 인증 백엔드 - 지원 방식: password_auth, ldap_auth, oauth_auth 등
auth_backend = airflow.api.auth.backend.basic_auth

# RBAC(역할 기반 접근 제어) 활성화 - 세밀한 권한 관리
rbac = True

# CSRF 보호 - 크로스 사이트 요청 위조 방지
enable_proxy_fix = False

# 기본 UI 페이지당 항목 수
page_size = 100

# HTTPS 설정
web_server_ssl_cert = /path/to/cert.pem
web_server_ssl_key = /path/to/key.pem

 

UI 커스터마이징 설정

[webserver]
# 브랜딩 설정
navbar_color = #007A87

# UI 색상 설정 - 다크 모드 여부
default_ui_timezone = UTC

# DAG 그래프 뷰 주기적 갱신 간격
dag_default_view = grid
dag_orientation = LR
dag_run_display_number = 25

 

성능 관련 설정

[webserver]
# 비동기 쿼리 실행 - UI 응답성 향상
async_dagbag_loader = True
async_dagbag_loader_timeout = 30

# 워커 갱신 배치 크기 - 한 번에 갱신할 워커 수
worker_refresh_batch_size = 1

# 워커 갱신 간격(초) - 주기적 워커 재시작으로 메모리 누수 방지
worker_refresh_interval = 30

📌 [scheduler] 섹션: 스케줄러 설정

기본 스케줄러 설정

[scheduler]
# 스케줄러 실행 관련 설정
# 동시에 실행할 스케줄러 프로세스 수 (2.0 이상)
max_dagruns_to_create_per_loop = 10

# 스케줄러 하트비트 간격(초) - 스케줄러 활동 주기
scheduler_heartbeat_sec = 5

# 스케줄러 최대 스레드 수 - 병렬로 실행할 스케드 프로세스 수
max_threads = 2

# 스케줄링 주기
min_file_process_interval = 30

 

DAG 파싱 및 처리 설정

[scheduler]
# DAG 디렉토리 스캔 주기(초) - 새 DAG 파일 검색 간격
dag_dir_list_interval = 300

# 파일 파싱 관련 설정 - 새 DAG 처리 방식
file_parsing_sort_mode = modified_time

# DAG 파싱 프로세스 수 - 병렬로 DAG 파일 처리
parsing_processes = 2

# 오래된 DAG 실행 삭제 - 데이터베이스 크기 관리에 중요
max_active_runs_per_dag = 16

 

태스크 스케줄링 설정

[scheduler]
# 한 번에 조회할 최대 태스크 인스턴스 수
max_tis_per_query = 512

# 실행 준비 태스크를 확인하는 주기
scheduler_idle_sleep_time = 1.0

# 한 번의 스케줄러 루프에서 처리할 최대 태스크 수
scheduler_max_tis_per_query = 512

# 동시에 실행 가능한 최대 태스크 인스턴스 수
max_active_tasks = 16

지속성 및 안정성 설정

[scheduler]
# 스케줄러가 충돌했을 때 메모리에 남아있는 작업을 처리할지 여부
use_job_schedule = True

# 잠금 재시도 설정 - 다중 스케줄러 환경에서 중요
scheduler_lock_timeout = 10

# 풀 리프레시 간격(초) - 작업 풀 업데이트 주기
pool_metrics_interval = 5.0

📌 [celery] 섹션: Celery 관련 설정

CeleryExecutor를 사용할 때 필요한 설정입니다.

Celery 기본 설정

[celery]
# Celery 브로커 설정
# Redis 사용 예
broker_url = redis://redis:6379/0

# RabbitMQ 사용 예
# broker_url = amqp://guest:guest@rabbitmq:5672//

# 결과 백엔드 - 완료된 태스크 결과 저장 위치
result_backend = db+postgresql://airflow:airflow@postgres:5432/airflow

# Celery 워커 동시성 - 워커당 처리할 수 있는 최대 태스크 수
worker_concurrency = 16

# 워커 자동 스케일링 - 최대, 최소 워커 수
worker_autoscale = 16,8

 

태스크 실행 및 라우팅 설정

[celery]
# 기본 대기열 - 태스크를 보낼 기본 Celery 대기열
default_queue = default

# 태스크 라우팅 설정
# 특정 태스크를 특정 대기열로 보내는 라우팅 규칙
worker_queues = default,high_priority,low_priority

# 태스크 실행 제한 시간(초)
task_execution_timeout = 300

# 태스크 취소 유예 시간(초) - 취소 후 강제 종료까지 대기 시간
task_cancel_grace_time = 2

 

워커 관리 설정

[celery]
# Celery 로깅 레벨
worker_log_server_port = 8793

# 워커 상태 보관 기간(초) - 이 시간 동안 응답이 없으면 워커가 오프라인으로 간주
worker_pre_terminate_graceful_timeout = 60

# 태스크 상태 보관 기간(초)
task_state_timeout = 3600

📌 [kubernetes] 섹션: Kubernetes 관련 설정

KubernetesExecutor를 사용할 때 필요한 설정입니다.

기본 Kubernetes 클러스터 설정

[kubernetes]
# Kubernetes 클러스터 연결 설정
# 클러스터 내부에서 실행 중인 경우, in_cluster를 True로 설정
in_cluster = True

# 클러스터 외부에서 접근하는 경우, kubeconfig 파일 경로 지정
# config_file = /path/to/kube_config

# 네임스페이스 설정 - Pod가 생성될 Kubernetes 네임스페이스
namespace = airflow

# API 연결 재시도 회수
kube_client_request_args = {"timeout": 60}

 

Pod 설정

[kubernetes]
# Pod 템플릿 파일 - Kubernetes Pod 생성 템플릿
pod_template_file = /path/to/pod_template.yaml

# 기본 이미지 - 태스크 실행에 사용될 Docker 이미지
worker_container_repository = apache/airflow
worker_container_tag = 2.5.1

# 기본 리소스 요청 및 제한
worker_request_memory = 1Gi
worker_request_cpu = 200m
worker_limit_memory = 2Gi
worker_limit_cpu = 500m

 

Pod 생명주기 및 관리 설정

[kubernetes]
# Pod 생명주기 관리
# 태스크 완료 후 Pod 삭제까지 대기 시간(초)
delete_worker_pods = True
delete_worker_pods_on_failure = True
worker_pods_creation_batch_size = 8

# 작업 완료 대기 시간 간격(초)
worker_pods_queued_check_interval = 60

# 환경 변수 및 시크릿 설정
env_from_configmap_ref = airflow-configmap
env_from_secret_ref = airflow-secrets

 

네트워킹 및 스토리지 설정

[kubernetes]
# 네트워킹 설정
enable_tcp_keepalive = True
tcp_keep_idle = 120
tcp_keep_intvl = 30
tcp_keep_cnt = 6

# 런타임 클래스 및 서비스 계정
kube_runtime_class_name = runc
worker_service_account_name = airflow

# 영구 볼륨 설정
git_sync_dest = git
git_ssh_known_hosts_configmap_name = airflow-ssh-known-hosts
dags_volume_claim = airflow-dags

📌 [logging] 섹션: 로깅 설정

기본 로깅 설정

[logging]
# 로깅 기본 설정
# 로그 저장 경로
base_log_folder = /path/to/airflow/logs

# 기본 로깅 레벨
logging_level = INFO

# 로그 파일 포맷
log_format = [%%(asctime)s] {%%(filename)s:%%(lineno)d} %%(levelname)s - %%(message)s
simple_log_format = %%(asctime)s %%(levelname)s - %%(message)s

 

원격 로깅 설정

[logging]
# 원격 로깅 활성화 - S3, GCS, HDFS 등에 로그 저장
remote_logging = False

# S3 로깅 예시
remote_base_log_folder = s3://my-bucket/airflow/logs
remote_log_conn_id = aws_s3_default

# GCS 로깅 예시
# remote_base_log_folder = gs://my-bucket/airflow/logs
# remote_log_conn_id = google_cloud_default

# 원격 로그 다운로드 - UI에서 원격 로그 조회 시 다운로드 여부
task_log_reader = task

 

로그 로테이션 및 보관 설정

[logging]
# 로그 로테이션 설정
# 로그 파일당 최대 크기(바이트)
log_rotation_file_size = 104857600  # 100MB

# 보관할 로그 파일 수
log_rotation_max_log_files = 30

# 로그 압축 설정
log_compression_enabled = True
log_compression_format = gz

📌 [metrics] 섹션: 모니터링 설정

메트릭 기본 설정

[metrics]
# 메트릭 수집 활성화
metrics_enabled = True

# 메트릭 수집 간격(초)
metrics_interval = 30

# 메트릭 제외 패턴
metrics_exclude_pattern = ^local_.*

# 통계 레벨 - 수집할 통계 상세도
statsd_on = False

 

메트릭 백엔드 설정

[metrics]
# StatsD 백엔드 설정
statsd_host = localhost
statsd_port = 8125
statsd_prefix = airflow

# 다양한 메트릭 백엔드 지원
# 프로메테우스 예시
metrics_backend = prometheus
metrics_port = 9102

📌 [secrets] 섹션: 보안 민감 정보 관리

보안 백엔드 설정

[secrets]
# 민감 정보 관리 백엔드 설정
backend = airflow.secrets.metastore.MetastoreBackend

# 환경 변수 백엔드
# backend = airflow.secrets.environment_variables.EnvironmentVariablesBackend

# 해시화된 연결 정보를 저장할 경로
backend_kwargs = {"connections_file_path": "/path/to/connections.json"}

 

외부 시크릿 관리자 설정

[secrets]
# AWS Secrets Manager 예시
# backend = airflow.secrets.aws_secrets_manager.SecretsManagerBackend
# backend_kwargs = {"connections_prefix": "airflow/connections", "variables_prefix": "airflow/variables"}

# HashiCorp Vault 예시
# backend = airflow.secrets.vault_backend.VaultBackend
# backend_kwargs = {"connections_path": "connections", "variables_path": "variables", "mount_point": "airflow", "url": "http://vault:8200"}

📌 실무에서 자주 수정하는 설정들

성능 최적화를 위한 설정

프로덕션 환경에서 성능을 최적화하기 위해 자주 조정하는 설정들입니다:

# 병렬성 및 동시성 설정
[core]
parallelism = 64  # 시스템 리소스에 맞게 조정
max_active_tasks_per_dag = 32

[scheduler]
max_threads = 4  # CPU 코어 수에 맞게 조정
parsing_processes = 4

# 데이터베이스 연결 풀 최적화
[core]
sql_alchemy_pool_size = 20
sql_alchemy_max_overflow = 20
sql_alchemy_pool_recycle = 1800

# DAG 처리 최적화
[core]
store_serialized_dags = True
min_serialized_dag_update_interval = 30
store_dag_code = True

[scheduler]
dag_dir_list_interval = 60  # DAG 파일이 자주 변경되지 않는 경우

 

보안 강화 설정

보안을 강화하기 위해 프로덕션 환경에서 필수적으로 수정해야 하는 설정들입니다:

# 인증 및 권한 설정
[webserver]
authenticate = True
rbac = True
auth_backend = airflow.api.auth.backend.basic_auth

# 암호화 키 설정 (반드시 설정해야 함)
[core]
fernet_key = YourSecureGeneratedFernetKey

# HTTPS 설정
[webserver]
web_server_ssl_cert = /path/to/cert.pem
web_server_ssl_key = /path/to/key.pem

# API 접근 제한
[api]
auth_backend = airflow.api.auth.backend.basic_auth

운영 편의성 설정

일상적인 운영을 편리하게 하기 위한 설정들입니다:

# 로깅 설정
[logging]
remote_logging = True  # 중앙 집중식 로그 관리
remote_base_log_folder = s3://my-company-bucket/airflow/logs

# 알림 설정
[email]
email_backend = airflow.utils.email.send_email_smtp
smtp_host = smtp.company.com
smtp_user = airflow
smtp_password = smtp_password
smtp_mail_from = airflow@company.com

# 예제 DAG 비활성화 (프로덕션)
[core]
load_examples = False

 

확장성 관련 설정

시스템 규모가 커짐에 따라 필요한 설정들입니다:

# 스케일 아웃을 위한 설정
[core]
executor = CeleryExecutor  # 또는 KubernetesExecutor

# Celery 분산 처리 설정
[celery]
worker_concurrency = 16
worker_autoscale = 16,8
broker_url = redis://redis-master.company.com:6379/0
result_backend = db+postgresql://airflow:airflow@postgres-master.company.com:5432/airflow

# Kubernetes 설정
[kubernetes]
namespace = airflow-prod
pod_template_file = /path/to/optimized_pod_template.yaml
worker_container_repository = company-registry/airflow
worker_container_tag = 2.5.1-custom

📌 환경별 설정 관리 전략

개발, 테스트, 프로덕션 환경 분리

환경별로 다른 설정을 관리하는 전략입니다:

  1. 환경 변수 활용:
# 개발 환경
export AIRFLOW__CORE__LOAD_EXAMPLES=True
export AIRFLOW__CORE__EXECUTOR=LocalExecutor

# 프로덕션 환경
export AIRFLOW__CORE__LOAD_EXAMPLES=False
export AIRFLOW__CORE__EXECUTOR=CeleryExecutor
export AIRFLOW__CORE__FERNET_KEY=ProductionFernetKey
  1. 설정 파일 템플릿 활용:
# 환경별 설정 파일 템플릿 생성
cp airflow.cfg airflow.cfg.dev
cp airflow.cfg airflow.cfg.prod

# 환경에 맞게 수정 후, 심볼릭 링크 생성
ln -sf airflow.cfg.dev airflow.cfg  # 개발 환경
ln -sf airflow.cfg.prod airflow.cfg  # 프로덕션 환경
  1. Docker/Kubernetes 환경에서의 ConfigMap 활용:
# Kubernetes ConfigMap 예시
apiVersion: v1
kind: ConfigMap
metadata:
  name: airflow-config
data:
  AIRFLOW__CORE__EXECUTOR: "KubernetesExecutor"
  AIRFLOW__CORE__LOAD_EXAMPLES: "False"
  AIRFLOW__CORE__FERNET_KEY: "your-fernet-key"
  # 기타 설정...

 

설정 변경 관리 모범 사례

  1. 변경 사항 문서화:
    • 모든 설정 변경 사항을 문서화하고 이유를 기록
    • 변경 이력 관리 (Git 등 버전 관리 시스템 활용)
  2. 점진적 변경:
    • 한 번에 많은 설정을 변경하지 않고 점진적으로 변경
    • 각 변경 후 충분한 테스트 진행
  3. 설정 파일 버전 관리:
    • airflow.cfg 파일을 Git과 같은 버전 관리 시스템에 포함
    • 민감한 정보는 환경 변수나 시크릿 관리 시스템으로 분리
  4. 설정 배포 자동화:
    • CI/CD 파이프라인에 설정 배포 과정 포함
    • 설정 변경 전후 자동 테스트 수행
  5. 롤백 계획 마련:
    • 설정 변경이 문제를 일으킬 경우 롤백 절차 준비
    • 이전 설정의 백업 유지

📌 airflow.cfg 문제 해결 및 디버깅

일반적인 문제 상황과 해결 방법

  1. 웹 서버 접근 문제:
# 문제: 외부에서 웹 UI에 접근 불가
# 해결: 웹 서버 호스트 설정 변경
[webserver]
web_server_host = 0.0.0.0  # 모든 인터페이스에서 접근 허용
  1. 데이터베이스 연결 실패:
# 문제: 데이터베이스 연결 오류
# 해결: 연결 문자열 및 타임아웃 설정 확인
[core]
sql_alchemy_conn = postgresql+psycopg2://airflow:airflow@postgres:5432/airflow
sql_alchemy_connect_args = {"connect_timeout": 30}
  1. 스케줄러 성능 저하:
# 문제: 스케줄러가 느리게 동작
# 해결: 스케줄러 설정 최적화
[scheduler]
max_threads = 4
parsing_processes = 4
scheduler_heartbeat_sec = 10
  1. 로그 생성 과다:
# 문제: 로그 파일이 너무 빠르게 커짐
# 해결: 로그 설정 조정
[logging]
logging_level = INFO  # DEBUG에서 변경
log_rotation_file_size = 104857600  # 100MB
log_rotation_max_log_files = 5
  1. 메모리 사용량 과다:
# 문제: 메모리 사용량이 너무 많음
# 해결: 관련 설정 최적화
[webserver]
worker_refresh_interval = 3600  # 주기적 워커 재시작
async_dagbag_loader = True

[scheduler]
parsing_processes = 1  # 줄이기
max_dagruns_to_create_per_loop = 1

설정 디버깅 방법

  1. 현재 설정 확인:
# 현재 적용된 모든 설정 출력
airflow config list

# 특정 섹션의 설정만 확인
airflow config list --section core

# 특정 설정 값 확인
airflow config get-value scheduler max_threads
  1. 로그 확인:
# 스케줄러 로그 확인
tail -f $AIRFLOW_HOME/logs/scheduler/*.log

# 웹 서버 로그 확인
tail -f $AIRFLOW_HOME/logs/webserver/*.log
  1. 설정 유효성 검사:
# Airflow DB 연결 검사
airflow db check

# Airflow 컴포넌트 검사
airflow info
  1. 환경 변수 확인:
# Airflow 관련 환경 변수 확인
env | grep AIRFLOW
  1. 테스트 모드 실행:
# 로컬에서 DAG 파일 테스트
python -c "from airflow.models import DagBag; d = DagBag(include_examples=False);"

 

주요 오류 메시지 및 대응 방법

  1. "Cannot find section [section_name] in config":
    • airflow.cfg 파일이 손상되었거나 해당 섹션이 없음
    • 기본 설정 파일을 복구하거나 해당 섹션 추가
  2. "OperationalError: (sqlite3.OperationalError) database is locked":
    • SQLite 데이터베이스가 잠김 (동시 접근 문제)
    • LocalExecutor나 CeleryExecutor로 변경하고 PostgreSQL/MySQL 사용
  3. "ModuleNotFoundError: No module named 'package_name'":
    • 필요한 패키지가 설치되지 않음
    • pip install apache-airflow[package_name] 실행
  4. "ValueError: invalid literal for int() with base 10: 'value'":
    • 설정 값의 타입이 올바르지 않음 (예: 숫자 필드에 문자열)
    • 올바른 타입으로 설정 수정
  5. "Unable to retrieve connection from the metadata DB":
    • 데이터베이스 연결 문제
    • 연결 문자열 및 데이터베이스 서비스 상태 확인

📌 airflow.cfg 최적화 모범 사례

 

Airflow 환경별 최적화 설정

 

리소스 효율성 최적화

리소스 사용을 최적화하기 위한 설정:

# 메모리 사용량 최적화
[core]
store_serialized_dags = True  # 메모리 사용량 감소
min_serialized_dag_fetch_interval = 30
max_active_runs_per_dag = 1  # 필요에 따라 조정

# CPU 사용량 최적화
[scheduler]
parsing_processes = 2  # CPU 코어 수에 따라 조정
dag_dir_list_interval = 300  # 빈번한 디스크 I/O 감소

# 데이터베이스 부하 최적화
[core]
sql_alchemy_pool_size = 5
sql_alchemy_max_overflow = 10

 

대규모 환경을 위한 최적화

수백 개의 DAG와 수천 개의 태스크를 관리하는 대규모 환경을 위한 설정:

# DAG 관리 최적화
[core]
store_serialized_dags = True
store_dag_code = True
max_active_tasks_per_dag = 32

# 스케줄러 최적화
[scheduler]
use_row_level_locking = True
max_dagruns_to_create_per_loop = 20
scheduler_heartbeat_sec = 10
parsing_processes = 8
max_tis_per_query = 512

# 분산 실행을 위한 설정
[core]
executor = CeleryExecutor

[celery]
worker_concurrency = 16
worker_autoscale = 16,4

 

로깅 및 모니터링 최적화

효율적인 로깅 및 모니터링을 위한 설정:

# 로깅 최적화
[logging]
remote_logging = True  # 중앙 집중식 로그 관리
remote_base_log_folder = s3://my-bucket/airflow/logs
remote_log_conn_id = my_aws_conn

# 로그 로테이션
log_rotation_file_size = 104857600  # 100MB
log_rotation_max_log_files = 10
log_compression_enabled = True

# 메트릭 수집
[metrics]
metrics_enabled = True
metrics_backend = statsd
statsd_host = localhost
statsd_port = 8125
statsd_prefix = airflow

 

배포 환경별 권장 설정

각 배포 환경에 따른 권장 설정:

  1. 개발 환경:
[core]
executor = LocalExecutor
load_examples = True
dag_concurrency = 8
max_active_runs_per_dag = 4

[webserver]
web_server_worker_timeout = 120
workers = 2

[scheduler]
parsing_processes = 1
  1. 테스트 환경:
[core]
executor = LocalExecutor
load_examples = False
dag_concurrency = 16
max_active_runs_per_dag = 8

[webserver]
workers = 4

[scheduler]
parsing_processes = 2
  1. 프로덕션 환경:
[core]
executor = CeleryExecutor  # 또는 KubernetesExecutor
load_examples = False
store_serialized_dags = True
dag_concurrency = 32
max_active_runs_per_dag = 16
fernet_key = [보안키]

[webserver]
authenticate = True
rbac = True
workers = 8
web_server_ssl_cert = /path/to/cert.pem
web_server_ssl_key = /path/to/key.pem

[scheduler]
parsing_processes = 4
scheduler_heartbeat_sec = 5

[celery]
worker_concurrency = 16
worker_autoscale = 16,4

Summary

  • airflow.cfg는 Airflow의 모든 구성 요소와 동작 방식을 정의하는 중앙 설정 파일로, 기본적으로 $AIRFLOW_HOME 디렉토리에 위치합니다.
  • 모든 설정은 환경 변수로 오버라이드할 수 있으며, 명명 규칙은 AIRFLOW__<섹션>__<설정_키> 형식을 따릅니다.
  • [core] 섹션에서는 디렉토리 설정, 데이터베이스 연결, Executor 선택, 병렬성, 보안 설정 등 Airflow의 핵심 동작을 정의합니다.
  • [webserver] 섹션은 웹 서버 호스트/포트, 워커 수, 인증/보안 설정, UI 커스터마이징 옵션 등을 관리합니다.
  • [scheduler] 섹션은 스케줄러 동작, DAG 파싱, 태스크 실행 관련 설정을 담당합니다.
  • [celery][kubernetes] 섹션은 각각 CeleryExecutor와 KubernetesExecutor 사용 시 필요한 설정을 제공합니다.
  • 실무에서 자주 수정하는 설정으로는 성능 최적화, 보안 강화, 운영 편의성, 확장성 관련 설정이 있습니다.
  • 환경별 설정 관리는 환경 변수, 설정 파일 템플릿, ConfigMap 등을 활용하여 개발/테스트/프로덕션 환경을 효과적으로 분리할 수 있습니다.
  • 문제 해결을 위해 현재 설정 확인, 로그 분석, 설정 유효성 검사, 환경 변수 확인 등의 방법을 활용할 수 있습니다.
  • 최적화 모범 사례로는 리소스 효율성, 대규모 환경, 로깅/모니터링 최적화, 배포 환경별 권장 설정 등이 있습니다.

 

728x90