气流任务失败后无法正确重试

时间:2020-06-02 23:10:38

标签: python airflow

我创建了一个具有重试次数的Airflow任务,并且在运行气流测试时似乎并没有真正重试。

def verify_pod_initialization(deployments):
   raise ValueError("test")
verify_deployments = PythonOperator(
    task_id='verify_pod_initialization', 
    retries=5, 
    python_callable=verify_pod_initialization, 
    op_kwargs={'deployments': {'etl-pipeline': 3}},
    dag=dag

我正在通过airflow test hello_world verify_pod_initialization 2015-06-01进行测试。

一切正常,但是我希望向自己证明运行测试,我可以看到它运行了X次->失败,然后通过。目前,它只运行一次。只是想知道最佳实践,以及如何使它在失败时可以重试。 ValueError不是我想要的吗?

我从任务中删除了业务逻辑以简化解释。

1 个答案:

答案 0 :(得分:1)

简短的答案是,这正是您定义重试的方式。当您使用其 scheduler 组件启动并运行Airflow时,它将完全按照您的期望工作。


Airflow本质上是建立定义如何执行计算任务的模型,但是在生产中,它使用 scheduler 来添加和评估数据,以确保这些计算任务在正确的时间运行。因此,某些模型和功能专门用于其自身体系结构中的各个部分。

首先,Airflow有其CLI,它将允许您使用命令来运行指定的计算任务。这是您命令的结果。它实质上是找到合适的计算任务,并使用传递给它的日期值生成任务实例并执行它。

但是,在CLI之上,Airflow有一个名为 scheduler 的系统组件。 调度程序使用基础数据模型来本质上计算并确定哪个计算任务已满足其依赖性并需要运行。

在这种情况下,调度程序会反复扫描您的DAG,以查看是否有满足其所有依赖关系的任务。如果有,它将生成一个retries=0的任务实例。 执行者执行计算。 执行者从尝试执行任务中获取信息,并更新模型或后端数据库。如果失败,它还将为状态字段提供failed状态。下次 scheduler 读取数据库时,它将看到失败的任务,然后它将重试值与配置的重试进行比较。如果推断出允许重试retries < max_retries-1并且状态失败,它将更改其状态,将1添加到重试,然后将指令传递给执行程序

或者,如果retries == max_retries - 1调度程序将任务状态设置为失败,则通知任务已失败,而不重试任务。