繁体   English   中英

并行运行 airflow 个任务/dag

[英]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_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并行运行?

编辑:我的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)

您将需要使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM