Какие основные компоненты входят в архитектуру Apache Airflow?

Ответ

Архитектура Apache Airflow состоит из нескольких взаимосвязанных компонентов, которые обеспечивают планирование, запуск и мониторинг рабочих процессов (DAGs).

Основные компоненты:

  • Web Server (Веб-сервер) Это пользовательский интерфейс (UI) на базе Flask. Он позволяет просматривать состояние DAG, запускать и отлаживать задачи, управлять подключениями и переменными.

  • Scheduler (Планировщик) Ключевой процесс, который отслеживает все DAG и задачи, определяет их зависимости и запускает выполнение по расписанию или триггеру. Он постоянно взаимодействует с базой данных метаданных.

  • Metadata Database (База данных метаданных) Хранилище (обычно PostgreSQL или MySQL), где Airflow хранит состояние всех DAG, задач, запусков, переменных, подключений и другую служебную информацию.

  • Executor (Исполнитель) Компонент, отвечающий за то, как и где будут выполняться задачи. Он получает задачи от планировщика и запускает их. Популярные исполнители:

    • LocalExecutor: Запускает задачи в параллельных процессах на той же машине, что и планировщик.
    • CeleryExecutor: Распределяет задачи по нескольким рабочим машинам (workers) с помощью очереди сообщений (RabbitMQ, Redis).
    • KubernetesExecutor: Создает отдельный pod в кластере Kubernetes для каждой выполняемой задачи.
  • Workers (Воркеры) Процессы или машины, которые непосредственно выполняют код задач. Они необходимы при использовании распределенных исполнителей, таких как CeleryExecutor.

Пример простого DAG:

# dags/my_first_dag.py
from airflow.models.dag import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime

with DAG(
    dag_id='simple_bash_dag',
    start_date=datetime(2023, 1, 1),
    schedule_interval='@daily',
    catchup=False,
    tags=['example'],
) as dag:
    task_hello = BashOperator(
        task_id='print_hello',
        bash_command='echo "Hello, Airflow!"',
    )

    task_date = BashOperator(
        task_id='print_date',
        bash_command='date',
    )

    task_hello >> task_date # Определение зависимости: task_date выполнится после task_hello