web-dev-qa-db-fra.com

Exécution de tâches / dags de flux d'air en parallèle

J'utilise airflow pour orchestrer certains scripts python. J'ai un dag "principal" à partir duquel plusieurs sous-dags sont exécutés. Mon dag principal est censé fonctionner selon l'aperçu suivant:

enter image description here

J'ai réussi à accéder à cette structure dans mon fichier principal en utilisant les lignes suivantes:

etl_internal_sub_dag1 >> etl_internal_sub_dag2 >> etl_internal_sub_dag3
etl_internal_sub_dag3 >> etl_adzuna_sub_dag
etl_internal_sub_dag3 >> etl_adwords_sub_dag
etl_internal_sub_dag3 >> etl_facebook_sub_dag
etl_internal_sub_dag3 >> etl_pagespeed_sub_dag

etl_adzuna_sub_dag >> etl_combine_sub_dag
etl_adwords_sub_dag >> etl_combine_sub_dag
etl_facebook_sub_dag >> etl_combine_sub_dag
etl_pagespeed_sub_dag >> etl_combine_sub_dag

Ce que je veux que airflow fasse, c'est d'abord lancer le etl_internal_sub_dag1 puis le etl_internal_sub_dag2 puis le etl_internal_sub_dag3. Quand le etl_internal_sub_dag3 est terminé je veux etl_adzuna_sub_dag, etl_adwords_sub_dag, etl_facebook_sub_dag, et etl_pagespeed_sub_dag pour fonctionner en parallèle. Enfin, lorsque ces quatre derniers scripts sont terminés, je veux que le etl_combine_sub_dag courir.

Cependant, lorsque j'exécute le dag principal, etl_adzuna_sub_dag, etl_adwords_sub_dag, etl_facebook_sub_dag, et etl_pagespeed_sub_dag sont exécutés un par un et non en parallèle.

Question: Comment puis-je m'assurer que les scripts etl_adzuna_sub_dag, etl_adwords_sub_dag, etl_facebook_sub_dag, et etl_pagespeed_sub_dag sont exécutés en parallèle?

Modifier: Mon default_args et DAG ressemblent à ceci:

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': start_date,
    'end_date': end_date,
    'email': ['[email protected]'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 0,
    'retry_delay': timedelta(minutes=5),
}

DAG_NAME = 'main_dag'

dag = DAG(DAG_NAME, default_args=default_args, catchup = False)
7
Mr. President

Vous devrez utiliser LocalExecutor.

Vérifiez vos configurations (airflow.cfg), vous utilisez peut-être SequentialExectuor qui exécute les tâches en série.

Airflow utilise une base de données backend pour stocker les métadonnées. Vérifier votre airflow.cfg fichier et recherchez le mot clé executor. Par défaut, Airflow utilise SequentialExecutor qui exécuterait la tâche séquentiellement quoi qu'il arrive. Ainsi, pour permettre à Airflow d'exécuter des tâches en parallèle, vous devrez créer une base de données dans Postges ou MySQL et la configurer dans airflow.cfg (sql_alchemy_conn param), puis changez d'exécuteur en LocalExecutor dans airflow.cfg puis exécutez airflow initdb.

Notez que pour utiliser LocalExecutor, vous devez utiliser Postgres ou MySQL au lieu de SQLite comme base de données principale.

Plus d'informations: https://airflow.incubator.Apache.org/howto/initialize-database.html

Si vous souhaitez faire un véritable essai routier d'Airflow, vous devriez envisager de configurer un véritable backend de base de données et de passer à LocalExecutor. Comme Airflow a été conçu pour interagir avec ses métadonnées à l'aide de la grande bibliothèque SqlAlchemy, vous devriez pouvoir utiliser n'importe quel backend de base de données pris en charge en tant que backend SqlAlchemy. Nous vous recommandons d'utiliser MySQL ou Postgres.

6
kaxil