有没有一种方法可以为同一DAG中的任务配置不同的“重试”

时间:2019-05-02 08:22:33

标签: airflow

我有一个包含许多子任务的DAG。在DAG的中间,有一个验证任务,根据该任务的结果/返回码,我想采用两种不同的方法。如果成功,将遵循一条路线(一系列任务),如果失败,我们将执行另一组任务。当前方法存在两个问题,一个是,如果退出代码为1,验证任务将执行多次(根据重试配置)。其次,无法采取不同的执行分支

要解决问题编号1,我们可以使用任务实例中提供的重试编号,该重试编号可以通过宏{{task_instance}}获得。欣赏是否有人可以为我们提供更清洁的方法,而采用不同途径的问题2仍未解决。

2 个答案:

答案 0 :(得分:1)

您可以在任务级别使用retries

run_this = BashOperator(
    task_id='run_after_loop',
    bash_command='echo 1',
    retries=3,
    dag=dag,
)

run_this_last = DummyOperator(
    task_id='run_this_last',
    retries=1,
    dag=dag,
)

关于第二个问题,有一个Branching的概念。

enter image description here

  

BranchPythonOperatorPythonOperator非常相似,除了它期望python_callable返回task_id(或task_id列表)。遵循返回的task_id,并且跳过所有其他路径。 Python函数返回的task_id必须直接引用BranchPythonOperator任务下游的任务。

示例DAG:

import random

import airflow
from airflow.models import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.python_operator import BranchPythonOperator

args = {
    'owner': 'airflow',
    'start_date': airflow.utils.dates.days_ago(2),
}

dag = DAG(
    dag_id='example_branch_operator',
    default_args=args,
    schedule_interval="@daily",
)

run_this_first = DummyOperator(
    task_id='run_this_first',
    dag=dag,
)

options = ['branch_a', 'branch_b', 'branch_c', 'branch_d']

branching = BranchPythonOperator(
    task_id='branching',
    python_callable=lambda: random.choice(options),
    dag=dag,
)
run_this_first >> branching

join = DummyOperator(
    task_id='join',
    trigger_rule='one_success',
    dag=dag,
)

for option in options:
    t = DummyOperator(
        task_id=option,
        dag=dag,
    )

    dummy_follow = DummyOperator(
        task_id='follow_' + option,
        dag=dag,
    )

    branching >> t >> dummy_follow >> join

答案 1 :(得分:0)

关于第一个问题,您可以轻松设置任务/操作员特定的重试选项。参考:baseoperator.py#L77

问题二,您可以使用BranchPythonOperator在DAG中轻松分支(示例用法:example_branch_operator.py)。您将需要在BranchPythonOperator中嵌套验证任务/逻辑(可以在运算符中定义和执行运算符)。