Apache Airflow:在单个DAG运行中运行所有并行任务

时间:2019-03-21 11:01:01

标签: parallel-processing task scheduled-tasks airflow

我有一个DAG,其中包含30个(或更多)动态创建的并行任务。

我在该DAG上设置了concurrency选项,以便在追查历史记录时仅运行一次DAG Run。 当我在服务器上运行它时,实际上只有16个任务并行运行,而其余14个只是等待排队。

我应该更改哪个设置,以便仅运行1个DAG Run,但同时运行30多个任务?

根据this FAQ,它似乎是dag_concurrencymax_active_runs_per_dag之一,但前者似乎已经受concurrency设置的驱动,而后者似乎无效(或者我实际上弄乱了设置)。 这是示例代码:

import datetime as dt
import logging

from airflow.operators.dummy_operator import DummyOperator

import config

from airflow import DAG
from airflow.operators.python_operator import PythonOperator

default_args = {
    'owner': 'airflow',
    'depends_on_past': True,
    'wait_for_downstream': True,
    'concurrency': 1,
    'retries': 0,
}


def print_operators(ds, **kwargs):
    logging.info(f"Task {kwargs.get('task_instance_key_str', 'unknown_task_instance')}")


dag = DAG(
    dag_id='test_parallelism_dag',
    start_date=dt.datetime(2019, 1, 1),
    default_args=default_args,
    schedule_interval='@daily',
    catchup=True,
    template_searchpath=[config.DAGS_PATH],
    params={'schema': config.SCHEMA_DB},
    max_active_runs=1,
)

print_operators = [PythonOperator(
    task_id=f'test_parallelism_dag.print_operator_{i}',
    python_callable=print_operators,
    provide_context=True,
    dag=dag
) for i in range(60)]

dummy_operator_start = DummyOperator(
    task_id=f'test_parallelism_dag.dummy_operator_start',
)

dummy_operator_end = DummyOperator(
    task_id=f'test_parallelism_dag.dummy_operator_end',
)

dummy_operator_start >> print_operators >> dummy_operator_end

编辑1 : 我当前的airflow.cfg包含:

executor = SequentialExecutor
parallelism = 32
dag_concurrency = 24
max_active_runs_per_dag = 26

我的env变量如下(将它们全部设置为不同的值以方便地找出哪一个可以帮助您):

AIRFLOW__CORE__EXECUTOR=LocalExecutor
AIRFLOW__CORE__DAG_CONCURRENCY=18
AIRFLOW__CORE__MAX_ACTIVE_RUNS_PER_DAG=20
AIRFLOW__CORE__WORKER_CONCURRENCY=22

因此,我有以下甘特图: enter image description here

哪种方式可以提示我设置DAG_CONCURRENCY env变量有效。

2 个答案:

答案 0 :(得分:1)

也更新concurrency文件中的airflow.cfg配置。如果是16,则将其增加到32。

如果您使用的是Celery Executor,请将worker_concurrency更改为32。

答案 1 :(得分:0)

要更改的实际参数是airflow.cfg中的dag_concurrency或使用AIRFLOW__CORE__DAG_CONCURRENCY env变量覆盖。

per docs I referred to in my question

  

concurrency:Airflow调度程序的运行时间不得超过$concurrency   您的DAG在任何给定时间的任务实例。并发定义   在您的气流DAG中。如果您未在DAG上设置并发,   调度程序将使用dag_concurrency中的默认值   在airflow.cfg中输入。

这意味着下面的简化代码:

default_args = {
    'owner': 'airflow',
    'depends_on_past': True,
    'wait_for_downstream': True,
    'concurrency': 1,
}


dag = DAG(
    dag_id='test_parallelism_dag',
    default_args=default_args,
    max_active_runs=1,
)

应重写为:

default_args = {
    'owner': 'airflow',
    'depends_on_past': True,
    'wait_for_downstream': True,
}


dag = DAG(
    dag_id='test_parallelism_dag',
    default_args=default_args,
    max_active_runs=1,
    concurrency=30
)

我的代码实际上有一个错误的假设,即default_args有时在DA​​G构造函数中替代了实际的kwarg。我不知道是什么原因导致我得出那个结论,但是我想将concurrency设置为1时会剩下一些草稿,它实际上并没有影响任何东西,并且实际的DAG并发是从config default设置的,是16。