如何控制气流中的DAG并发性

时间:2017-08-18 09:13:28

标签: python airflow

我使用airflow v1.7.1.3

我有两个DAG,dag_a和dag_b。 我一次设置了10个dag_a任务,理论上应该逐个执行。实际上,10个dag_a任务是并行执行的。 并发参数不起作用。谁能告诉我为什么?

这是伪代码:

在dag_a.py

dag = DAG('dag_a',
            start_date=datetime.now(),
            default_args=default_args,
            schedule_interval=None,
            concurrency=1,
            max_active_runs=1)

在dag_b.py

from fabric.api import local

dag = DAG('dag_b',
            start_date=datetime.now(),
            default_args=default_args,
            schedule_interval='0 22 */1 * *',
            concurrency=1,
            max_active_runs=1)


def trigger_dag_a(**context):

    dag_list = []
    for rec in rang(1,10):
        time.sleep(2)
        cmd = "airflow trigger_dag dag_a"

        log.info("cmd:%s"%cmd)
        msg = local(cmd)    #"local" is function in fabric
        log.info(msg)


trigger_dag_a_proc = PythonOperator(python_callable=trigger_dag_a,
                          provide_context=True,
                          task_id='trigger_dag_a_proc',
                          dag=dag)

2 个答案:

答案 0 :(得分:8)

您可以通过指定池来限制任务实例。

  1. 在UI中创建一个池:
  2. Pool

    2.然后设置你的dags使用这个池:

            default_args = {
                        'email_on_failure': False,
                        'email_on_retry': False,
                        'start_date': datetime(2017, 12, 16),
                        'pool': 'my_pool'
                    }
    
            dag = DAG(
                dag_id='foo',
                schedule_interval='@daily',
                default_args=default_args,
            )
    

答案 1 :(得分:1)

AFAIK,外部dag触发器不尊重DAG的concurrency / max_active_runs参数。这也适用于回填。

只有调度程序安排的dag运行才会遵循这些参数。