Что такое пулы (Pools) в Apache Airflow и какую задачу они решают

Ответ

Пул (Pool) в Apache Airflow — это механизм для ограничения количества одновременно выполняемых задач, которые к нему отнесены. Основная задача пулов — контролировать нагрузку на внешние системы и управлять конкурентным доступом к ограниченным ресурсам.

Каждому пулу назначается определенное количество слотов. Когда задача, назначенная пулу, запускается, она занимает один слот. Если в пуле нет свободных слотов, задача будет ожидать в очереди, пока другой слот не освободится.

Зачем это нужно?

Представьте, что у вас есть несколько DAG, которые активно обращаются к API внешнего сервиса, допускающего не более 5 одновременных запросов. Без пулов вы рискуете превысить лимит и получить ошибки. Создав пул с 5 слотами и назначив ему все задачи, работающие с этим API, вы гарантируете, что Airflow никогда не отправит более 5 запросов одновременно.

Как использовать:

  1. Создание пула: Пулы создаются через UI Airflow (Admin -> Pools) или через CLI.
  2. Назначение задачи пулу: В коде DAG для оператора указывается параметр pool.

Пример:

from airflow.operators.bash import BashOperator
from airflow.models.dag import DAG
import pendulum

# Предполагается, что пул 'api_pool' с 5 слотами уже создан в UI

with DAG(
    dag_id='example_pool_dag',
    start_date=pendulum.datetime(2023, 1, 1, tz="UTC"),
    schedule=None,
    catchup=False
) as dag:
    task_1 = BashOperator(
        task_id='task_using_api_1',
        bash_command='echo "Calling API..." && sleep 5',
        pool='api_pool'  # Назначаем задачу в пул
    )

    task_2 = BashOperator(
        task_id='task_not_in_pool',
        bash_command='echo "Just a regular task..." && sleep 1',
        # Эта задача использует default_pool
    )

По умолчанию все задачи используют default_pool, у которого 128 слотов.