![](/img/trans.png)
[英]BranchPythonOperator not running with past skipped state task
[英]The rest of the task should not skip if BranchPythonOperator result is False
我有一个 Airflow DAG,它分支到是否发送电子邮件。 will_send_email_task
是一个 BranchPythonOperator, if len(message) > 0
,它应该去分支任务send_email_notification_task
。 否则,该任务将被跳过并直接转到 DummyOperator join_task
。 当分支的结果为True
时,DAG 工作正常(是的,它应该发送电子邮件)。 但是,当结果为False
时,将跳过 DAG 的其余部分,这不是预期的结果。 如果will_send_email_task
为False
的预期结果应该是只有send_email_notification_task
被跳过/绕过,但流程的其余部分继续正常。
这是 Airflow DAG 片段:
# this function determines whether to send an email or not
def will_send_email(push_task, **context):
message = context["task_instance"].xcom_pull(task_ids=push_task)
if len(message) > 0:
logging.info(f"email body: {message}")
context["task_instance"].xcom_push(key="message", value=message)
return 'send_email_notification_task'
else:
return 'join_task'
def some_python_callable(table_name, **context):
...
will_send_email_task = BranchPythonOperator(
task_id='will_send_email_task',
provide_context=True,
python_callable=will_send_email,
op_kwargs={'push_task': 'some_previous_task'},
dag=dag
)
join_task = DummyOperator(
task_id='join_task',
dag=dag
)
send_email_notification_task = EmailOperator(
task_id='send_email_notification_task',
to=default_args['email'],
subject="some email subject",
html_content="{{ task_instance.xcom_pull(key='message') }}",
dag=dag
)
end_task = DummyOperator(
task_id='end_task',
dag=dag
)
...
for table, val in some_dict.items():
offload_task = PythonOperator(
task_id = f"offload_{table}_task",
dag=dag,
provide_context=True,
python_callable=some_python_callable,
op_kwargs={'table_name': table}
)
offload_task.set_upstream(join_task)
offload_task.set_downstream(end_task)
我应该如何配置我的 DAG 以使其仍按预期运行?
您需要为 join_task 设置trigger_rule='none_failed_min_one_success'
join_task
join_task = DummyOperator(
task_id='join_task',
dag=dag,
trigger_rule='none_failed_min_one_success'
)
这是一个在触发规则文档中解释的用例。 默认触发规则是all_success
但在您的情况下,保证会跳过join_task
的上游任务之一,因此您不能使用默认触发规则。
注意:对于 Airflow < 2.2 使用trigger_rule='none_failed_or_skipped'
trigger_rule='none_failed_or_skipped'
触发规则只是在后来的版本中重命名,因为它的名称令人困惑(参见PR ),您也可以使用trigger_rule='all_done'
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.