Learning Platform
Глоссарий Troubleshooting
Урок 12.01 · 10 мин
Продвинутый
PoolsConcurrencyPriority Weight

Pools и Concurrency — обзор модуля

Concurrency в Airflow — это пять уровней ограничений, которые работают одновременно. Понимание их взаимодействия критично для предотвращения over-allocation внешних ресурсов (например, не положить Snowflake warehouse).

Уроки модуля

#УрокЧто внутри
01Обзор модуляТекущий урок
025 уровней concurrencyParallelism, max_active_tasks, dag_concurrency, task_concurrency, pool slots
03Pool slots — gate в critical sectionRow-level lock, why pool changes идемпотентны serialized
04Priority Weight Strategiesdownstream / upstream / absolute, как scheduler сортирует
05Slot contention scenariosCommon deadlock patterns, mitigations

Пять уровней concurrency

#УровеньКонфигDefault
1Cluster-wide[core] parallelism32
2Per DAGdag_concurrency (default), max_active_tasks_per_dag16
3Per DAG runmax_active_runs_per_dag16
4Per tasktask_concurrency (legacy), max_active_tis_per_dagunlimited
5Pool slotsslots in slot_pool tableper pool

Любой из этих ограничивает execution. Самый ограничивающий выигрывает.

Priority Weight

@task(priority_weight=10)
def important_task(): ...

@task(priority_weight=1)
def normal_task(): ...

weight_rule:

  • downstream (default) — priority = own + sum of downstream
  • upstream — priority = own + sum of upstream
  • absolute — only own value

Pool как critical section gate

Pool — это не просто счётчик. Это row в таблице slot_pool, на которую scheduler берёт row-level lock в critical section. Это значит:

  1. Все pool decisions atomically serialized
  2. Multi-scheduler конкурирует за pool через NOWAIT
  3. Нельзя over-allocate — даже под high concurrency

Killer pattern: Snowflake warehouse protection

@task(pool="snowflake_xs", pool_slots=2)
def heavy_query():
    pass

В UI создаём pool snowflake_xs с 10 slots = 5 одновременных queries. Это предотвращает положить warehouse даже при 100 готовых tasks.

Killer takeaway

Если в production tasks стоят в queued state и не запускаются — первым делом смотреть pool occupancy:

SELECT pool, slots, used_slots, queued_slots, scheduled_slots
FROM slot_pool;

Если used_slots = slots — pool exhausted. Не tuning executor concurrency, не больше workers — это pool.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 6