并行运行气流任务/损失

时间:2018-10-10 13:37:27

标签: python python-3.x airflow

我正在使用气流编排一些python脚本。我有一个“主要” dag,从中可以运行几个subdag。我的主要任务应该按照以下概述运行:

enter image description here

通过使用以下几行,我已经设法在主菜单中找到此结构:

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

我想让气流进行的工作是先运行etl_internal_sub_dag1,然后运行etl_internal_sub_dag2,然后运行etl_internal_sub_dag3etl_internal_sub_dag3完成后,我希望etl_adzuna_sub_dagetl_adwords_sub_dagetl_facebook_sub_dagetl_pagespeed_sub_dag并行运行。最后,当最后四个脚本完成时,我希望运行etl_combine_sub_dag

但是,当我运行主dag时,etl_adzuna_sub_dagetl_adwords_sub_dagetl_facebook_sub_dagetl_pagespeed_sub_dag会一个接一个地运行,而不是并行运行。

问题::如何确保脚本etl_adzuna_sub_dagetl_adwords_sub_dagetl_facebook_sub_dagetl_pagespeed_sub_dag并行运行? / p>

编辑:我的default_argsDAG如下:

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': start_date,
    'end_date': end_date,
    'email': ['myname@gmail.com'],
    '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)

1 个答案:

答案 0 :(得分:5)

您将需要使用LocalExecutor

检查您的配置(airflow.cfg),您可能正在使用SequentialExectuor来串行执行任务。

Airflow使用后端数据库存储元数据。检查您的airflow.cfg文件并查找executor关键字。默认情况下,Airflow使用SequentialExecutor,无论如何,它将顺序执行任务。因此,要允许Airflow并行运行任务,您需要在Postges或MySQL中创建一个数据库,并在airflow.cfgsql_alchemy_conn参数)中对其进行配置,然后在{ {1}},然后运行LocalExecutor

请注意,要使用airflow.cfg,您需要使用Postgres或MySQL而不是SQLite作为后端数据库。

更多信息:https://airflow.incubator.apache.org/howto/initialize-database.html

  

如果您想对Airflow进行真实的测试,则应考虑设置真实的数据库后端并切换到LocalExecutor。由于Airflow是使用强大的SqlAlchemy库构建的,可与其元数据进行交互,因此您应该能够将任何支持的数据库后端用作SqlAlchemy后端。我们建议使用MySQL或Postgres。