[英]Running airflow tasks/dags in parallel
我正在使用 airflow 编排一些 python 脚本。 我有一个“主”dag,从中运行了几个 subdags。 我的主要 dag 应该根据以下概述运行:
我已经通过使用以下几行设法在我的主 dag 中找到了这个结构:
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
我想要 airflow 做的是先运行etl_internal_sub_dag1
然后运行etl_internal_sub_dag2
然后运行etl_internal_sub_dag3
。 当etl_internal_sub_dag3
完成后,我希望etl_adzuna_sub_dag
、 etl_adwords_sub_dag
、 etl_facebook_sub_dag
和etl_pagespeed_sub_dag
并行运行。 最后,当这最后四个脚本完成后,我希望运行etl_combine_sub_dag
。
但是,当我运行主 dag 时, etl_adzuna_sub_dag
、 etl_adwords_sub_dag
、 etl_facebook_sub_dag
和etl_pagespeed_sub_dag
一个接一个地运行,而不是并行运行。
问题:如何确保脚本etl_adzuna_sub_dag
、 etl_adwords_sub_dag
、 etl_facebook_sub_dag
和etl_pagespeed_sub_dag
并行运行?
编辑:我的default_args
和DAG
看起来像这样:
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)
您将需要使用LocalExecutor
。
检查您的配置( airflow.cfg
),您可能正在使用SequentialExectuor
执行任务的SequentialExectuor
。
Airflow 使用后端数据库来存储元数据。 检查您的airflow.cfg
文件并查找executor
关键字。 默认情况下,Airflow 使用SequentialExecutor
,它无论如何都会按顺序执行任务。 因此,为了允许 Airflow 并行运行任务,您需要在 Postges 或 MySQL 中创建一个数据库并在airflow.cfg
( sql_alchemy_conn
param ) 中配置它,然后将您的执行器更改为LocalExecutor
中的airflow.cfg
,然后运行airflow.cfg
airflow initdb
。
请注意,要使用LocalExecutor
您需要使用 Postgres 或 MySQL 而不是 SQLite 作为后端数据库。
更多信息: https : //airflow.incubator.apache.org/howto/initialize-database.html
如果你想对 Airflow 进行真正的试驾,你应该考虑设置一个真正的数据库后端并切换到 LocalExecutor。 由于 Airflow 是为使用强大的 SqlAlchemy 库与其元数据交互而构建的,因此您应该能够使用任何支持的数据库后端作为 SqlAlchemy 后端。 我们推荐使用 MySQL 或 Postgres。
并行运行任务的一种简单解决方案是将它们放在 [ ] 括号中。 例如: task_start >> [task_get_users, task_get_posts, task_get_comments, task_get_todos]
有关更多信息,您可以阅读来自 towardsdatascience 的这篇文章
尝试:
etl_internal_sub_dag3 >> [etl_adzuna_sub_dag, etl_adwords_sub_dag, etl_facebook_sub_dag, etl_pagespeed_sub_dag]
[etl_adzuna_sub_dag, etl_adwords_sub_dag, etl_facebook_sub_dag, etl_pagespeed_sub_dag] >> etl_combine_sub_dag
我执行了第一个任务,这真的很有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.