我有三个任务t1,t2,t3
。每个任务输出是下一个任务输入,例如,t1
输出是t2
输入。 t1
完成后,我得到一个空的输出文件夹(在我的情况下可能会发生,并且可以接受并且标记为t1
成功),但是t2
无法获取以下文件的输出t1
,因为没有文件。如果没有文件,我想将t2
和t3
标记为成功。如何跳过接下来的两个任务。
我浏览了气流文档,其他文章也涉及传感器和戳戳方法。但是,不确定如何进行。
答案 0 :(得分:6)
您可以利用SensorOperator更具体地说FileSensorOperator来检查文件是否存在。然后,当文件不存在时,可以使用soft_fail arg将任务标记为“已跳过”。这将使DAG成功执行,同时保持文件检查中发生的正确记录。
答案 1 :(得分:1)
@andscoop的答案很好,但这只是为了带来更多想法:
我正在做类似的事情(依赖项A> B> C),并且已经使用默认情况下由上一个任务推送的XCOM解决了该方法。
execute方法返回的任何值都保存为Xcom消息 在键
return_value
下。稍后我们将讨论该主题。 来源http://michal.karzynski.pl/blog/2017/03/19/developing-workflows-with-apache-airflow/
# copy&paste it into dags/stackoverflow.py to test it
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime
dag = DAG('stackoverflow', description='Another Dag',
schedule_interval='* * * 1 1',
start_date=datetime(2018, 6, 27), catchup=False)
def do_a(**kwargs):
# Assuming that your TASK A is not returning a value
return None
task_a = PythonOperator(task_id='do_a',
python_callable=do_a,
provide_context=True,
dag=dag)
def do_b(**kwargs):
result_from_a = kwargs['ti'].xcom_pull(task_ids='do_a')
if result_from_a:
print("Continue with your second task")
else:
print("Send a notification somewhere, log something or stop the job here.")
task_b = PythonOperator(task_id='do_b',
python_callable=do_b,
provide_context=True,
dag=dag)
task_a >> task_b
分支。您可以通过更复杂的方式(并使用最佳做法)根据t1
的结果进行分支以确定下一步/任务。我现在不能做一个合适的例子,但是这里有2个资料来理解它如何与例子一起工作: