我正在从元数据表中获取类别,并使用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
答案 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