气流:优先处理故障

时间:2019-06-03 13:01:44

标签: airflow airflow-scheduler

我正在从元数据表中获取类别,并使用python脚本为每个类别创建动态dag。目前,我们大约有15个类别,因此每个类别都有自己的dag。我的Dag文件有3个任务,并且按顺序运行。

使用LocalExecutor。所有15个dag(dag-runs)并行触发。我们没有足够的资源(任务很繁重)来并行运行所有15个dag。

有什么方法可以确定dag运行的优先级?应该先运行5个dag,然后再运行5个,依此类推。作业应基于可用资源运行,其他应在队列中。这应该是动态的。

解决此问题的最佳方法?请帮助。

示例dag:

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta


default_args = {
    'start_date': datetime(2019, 6, 03),
    'retries': 1,
    'retry_delay': timedelta(minutes=5)
}

dag = DAG('test', catchup=False, default_args=default_args, schedule_interval='*/5 * * * *')

t1 = BashOperator(
    task_id='print_start_date',
    bash_command='date',
    dag=dag)

t2 = BashOperator(
    task_id='sleep',
    bash_command='sleep 50s',
    retries=3,
    dag=dag)

t3 = BashOperator(
    task_id='print_end_date',
    bash_command='date',
    dag=dag)

t1 >> t2 >> t3

1 个答案:

答案 0 :(得分:0)

如果您都在LocalExecutor上运行并且都同时运行,则没有一种有效的方法。

如果您要使用CeleryExecutor并拥有多台工作机,则可以使用Airflow Queues的概念来创建一个“优先级”队列,该队列为您指示为高优先级的DAG提供服务。

另一个选择是使用Sub DAGs。 15个DAG中的每个DAG都可以构造为子DAG,并可以按所需顺序运行。这是一个可能看起来像的例子:

start ----> Sub Dag 1 --> Sub Dag  6 --> Sub Dag 11
       |--> Sub Dag 2 --> Sub Dag  7 --> Sub Dag 12
       |--> Sub Dag 3 --> Sub Dag  8 --> Sub Dag 13
       |--> Sub Dag 4 --> Sub Dag  9 --> Sub Dag 14
       |--> Sub Dag 5 --> Sub Dag 10 --> Sub Dag 15