任务失败后,气流停止调度dagruns

时间:2018-08-30 18:15:42

标签: python scheduled-tasks scheduler airflow

如果dagrun失败,气流会令我感到困惑。我要实现的行为是:

  1. DAG的定期触发器(每小时)
  2. 重试任务
  3. 如果任务失败n次重试,请发送有关失败的电子邮件
  4. 下一个每小时触发一次的时候,就像没有发生任何故障一样触发一个新的dagrun。

这些是我的dag参数和任务参数:

默认任务:

y_true_mod

dag参数:

'depends_on_past': True,
'start_date': airflow.utils.dates.days_ago(2),
'email': ['email@address.co.uk'],
'email_on_failure': True,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
'wait_for_downstream': False,

我认为我对这些论点有误解,因为在我看来,如果一个任务失败n次(即dagrun失败),则下一个dagrun会被安排,但永远永远处于运行状态,再也不会出现dagruns成功(甚至得到安排)。例如,以下是dagruns(我不知道在何处可以找到基于文本的调度程序日志,例如this question),其中dagruns被安排为每5分钟而不是每小时运行一次:

enter image description here

执行每5分钟运行一次,直到失败为止,之后的最后一次执行只是处于运行状态,并且在过去30分钟一直如此。

我做错了什么?

我应该补充一点,重启调度程序无济于事,手动将正在运行的任务设置为失败...

2 个答案:

答案 0 :(得分:2)

您已将depends_on_past设置为True,这将阻止启动下一个DagRun。

From the docs: depends_on_past(布尔)–设置为true时,任务实例将顺序运行,同时依赖于先前任务的时间表来成功执行。允许运行start_date的任务实例。

这意味着您的Dag正在尝试运行,但是正在等待,直到之前的DagRun中的相应任务具有成功状态为止。

答案 1 :(得分:1)

这个问题让我很头疼,所以我想发布一个完整的解决方案。

就我而言,即使上一个执行失败,下一个DAG的执行也不会开始,即使我有选项depends_on_past = False。 这是因为wait_for_downstream选项为True,并且此组合不兼容。根据文档:

  

wait_for_downstream(bool)-设置为true时,任务X的实例将等待>在任务X的前一个实例的紧下游立即成功完成,然后再运行。如果任务> X的不同实例更改同一资产,并且该资产由任务X的下游任务使用,则这很有用。

最后请注意,max_active_runs = 1选项很重要 之所以被激活,是因为在另一种情况下,同一任务可以在随后的多个dag运行中同时开始运行。

from datetime import datetime, timedelta
from airflow.models import DAG
from airflow.operators.python_operator import PythonOperator

args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'wait_for_downstream': False,
    'start_date': datetime(2019, 7, 20),
}

dag = DAG(
    dag_id='test_v8',
    default_args=args,
    schedule_interval='* * * * *',
    catchup=False,
    max_active_runs=1

)

from time import sleep


def sleep_1():
    sleep(1)


def sleep_2():
    sleep(2)


sleep_2 = PythonOperator(
    task_id='sleep_2',
    python_callable=sleep_2,
    dag=dag,
)

sleep_1 = PythonOperator(
    task_id='sleep_1',
    python_callable=sleep_1,
    dag=dag,
)

sleep_1 >> sleep_2

最后完成了工作!

enter image description here