我有一个包含许多子任务的DAG。在DAG的中间,有一个验证任务,根据该任务的结果/返回码,我想采用两种不同的方法。如果成功,将遵循一条路线(一系列任务),如果失败,我们将执行另一组任务。当前方法存在两个问题,一个是,如果退出代码为1,验证任务将执行多次(根据重试配置)。其次,无法采取不同的执行分支
要解决问题编号1,我们可以使用任务实例中提供的重试编号,该重试编号可以通过宏{{task_instance}}获得。欣赏是否有人可以为我们提供更清洁的方法,而采用不同途径的问题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的概念。
BranchPythonOperator与PythonOperator非常相似,除了它期望
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
中嵌套验证任务/逻辑(可以在运算符中定义和执行运算符)。