当其他subdag操作程序正在运行时,subdag操作程序的气流重新运行

时间:2018-07-18 19:59:28

标签: airflow airflow-scheduler

我在LocalExecutor上使用气流1.9.0。

我有一个子目录,其中包含两个长期运行的任务。 subdag的结构为:

def create_subdag(name_suffix, default_args):
    dag_name = '{}.{}'.format(parent_dag_name, name_suffix)
    subdag = DAG(dag_name, start_date=start, schedule_interval=schedule, default_args=default_args)

    t1 = BashOperator(
        task_id='print_date',
        bash_command='some_long_running_cmd_1',
        dag=subdag)

    t2 = BashOperator(
        task_id='sleep',
        bash_command='some_long_running_cmd_2',
        dag=subdag)

sub_dag_1 = SubDagOperator(
    subdag=create_subdag('subdag1', default_args),
    task_id='subdag1',
    dag=dag)

即使任务t1仍在运行,我也希望能够在任务t2失败时重新运行它。通常,清除失败任务的状态会使它重新计划,即使dag中的其他任务正在运行。但是,清除任务t2的状态不会使其重新计划。此外,在sub_dag_1仍在运行时清除其状态似乎会使调度程序进入挂起状态,即使在t2完成后,DAG也不会从running过渡出来,但是t1从未重新计划执行。

是否有一种方法可以立即在subdag中重新运行任务,而无需等待其他任务完成?

1 个答案:

答案 0 :(得分:0)

我有以下可能的解决方案:

  1. 在子目录中,请先尝试清除t2,然后再手动重新独立运行t2
  2. 通常sub_dag_1完成时(要么以失败状​​态的成功状态结束),然后清除t2将自动重新触发t2的运行。
  3. 如果在t2仍在运行且t1也正在运行的情况下,如果您仍想重新运行sub_dag_1,请使sub_dag_1成功(非递归)。然后重复2。

希望这会对您有所帮助。顺便说一句,SubDagOperator并不是在实际应用中使用的很好的运算符,根据我的经验,它会增加更多的问题(例如,subdag deadlock,芹菜工作者开始执行subdag任务的速度变慢等)与解决的问题进行比较。