我使用气流已经有一段时间了,遇到了重复发生的DAG同时运行两次的问题。请允许我解释一下:
我有一个DAG,它由一些BashOperators,PythonOperators和一个SubDagOperator的五个实例组成(该实例使用Bash执行一些较长的应用程序),然后从FileSensor开始。
FileSensor(
task_id='wait_for_data',
fs_conn_id='fs_default',
filepath=metadata_path_local,
)
通过以下方式创建dag:
default_args = {
'owner': 'MyProject',
'depends_on_past': False,
'start_date': datetime(2015, 6, 1),
'email': [configuration.conf.get('user', 'email_address')],
'email_on_failure': configuration.conf.getboolean('user', 'email_on_failure'),
'email_on_retry': configuration.conf.getboolean('user', 'email_on_retry'),
'retries': 1,
'retry_delay': timedelta(minutes=1),
'mode': 'reschedule'
}
DAG(
'dag_name',
default_args=default_args,
schedule_interval=timedelta(minutes=1),
concurrency=5,
max_active_runs=1,
catchup=False,
dagrun_timeout=timedelta(hours=3)
)
我希望DAG在3小时后停止运行,而不管结果如何或处于什么位置,这就是dagrun_timeout arg的原因。并行性设置为5,以允许所有SubDagOperator实例彼此并排运行。另外,请注意max_active_runs = 1
最后,对于我遇到的问题- FileSensor从1PM开始。在下午3:30,它在受跟踪的目录中找到一个文件并开始该过程-最终到达SubDAG,并在那儿延迟执行较长的过程。 下午4点,DAG的新实例将开始与之一起运行-我绝对不希望发生这种情况。
当我检查DAG计划时,运行之间恰好相差3小时-这使dagrun_timeout成为我的直接怀疑对象。我有一个论点,那就是SubDagOperator不继承dagrun_timeout,因此我将其添加到了它的初始化中:
subdag = DAG(
'subdag_1', # 2,3,4,5 for the other instances
default_args=default_args,
schedule_interval=timedelta(minutes=1),
concurrency=5,
max_active_runs=1,
catchup=False,
orientation='TB',
dagrun_timeout=timedelta(hours=3)
)
但不幸的是,问题仍然存在。
我想念什么?如何保证排除不同的DAG运行?
提前谢谢!