web-dev-qa-db-fra.com

Comment contrôler le parallélisme ou la simultanéité d'un DAG Airflow?

Dans certaines de mes installations Airflow, les DAG ou les tâches dont l'exécution est planifiée ne s'exécutent pas même lorsque le planificateur n'est pas entièrement chargé. Comment puis-je augmenter le nombre de DAG ou de tâches pouvant s'exécuter simultanément?

De même, si mon installation est sous forte charge et que je souhaite limiter la vitesse à laquelle mes employés Airflow extraient les tâches en file d'attente, que puis-je ajuster?

9
hexacyanide

Voici une liste étendue des options de configuration disponibles dans Airflow v1.10.2. Certains peuvent être définis sur une base par DAG ou par opérateur, et peuvent revenir aux paramètres par défaut de la configuration s'ils ne sont pas spécifiés.


Options pouvant être spécifiées par DAG :

  • concurrency: le nombre d'instances de tâches autorisées à s'exécuter simultanément sur toutes les exécutions actives du DAG sur lequel il est défini. Par défaut à core.dag_concurrency si non défini
  • max_active_runs: nombre maximal d'exécutions actives pour ce DAG. Le planificateur ne créera pas de nouvelles exécutions DAG actives une fois cette limite atteinte. Par défaut à core.max_active_runs_per_dag si non défini

Exemples:

# Only allow one run of this DAG to be running at any given time
dag = DAG('my_dag_id', max_active_runs=1)

# Allow a maximum of 10 tasks to be running across a max of 2 active DAG runs
dag = DAG('example2', concurrency=10, max_active_runs=2)

Options pouvant être spécifiées par opérateur :

  • pool: le pool dans lequel exécuter la tâche. Pools peut être utilisé pour limiter le parallélisme pour seulement un sous-ensemble de tâches
  • task_concurrency: limite de concurrence par niveau de tâche

Exemple:

t1 = BaseOperator(pool='my_custom_pool', task_concurrency=12)

Options spécifiées sur l'ensemble d'une configuration Airflow :

  • core.parallelism: nombre maximal de tâches exécutées sur une installation Airflow entière
  • core.dag_concurrency: nombre maximal de tâches pouvant être exécutées par DAG (sur plusieurs DAG s'exécute)
  • core.non_pooled_task_slot_count: nombre d'emplacements de tâches alloués aux tâches non exécutées dans un pool
  • core.max_active_runs_per_dag: nombre maximum de DAG actifs s'exécute, par DAG
  • scheduler.max_threads: combien de threads le processus du planificateur doit utiliser pour planifier les DAG
  • celery.worker_concurrency: nombre d'instances de tâches qu'un travailleur prendra si vous utilisez CeleryExecutor
  • celery.sync_parallelism: nombre de processus que CeleryExecutor doit utiliser pour synchroniser l'état des tâches
21
hexacyanide

Vérifiez la configuration du flux d'air pour laquelle core.executor est utilisé. SequentialExecutor s'exécutera séquentiellement, vous pouvez donc choisir Local Executor ou Clery Executor qui exécutent la tâche en parallèle. Après cela, vous pouvez utiliser d'autres options comme mentionné par @hexacyanide

1
Salman Faris