停止执行气流中剩余的任务

时间:2018-06-26 14:48:58

标签: python airflow airflow-scheduler

我有三个任务t1,t2,t3。每个任务输出是下一个任务输入,例如,t1输出是t2输入。 t1完成后,我得到一个空的输出文件夹(在我的情况下可能会发生,并且可以接受并且标记为t1成功),但是t2无法获取以下文件的输出t1,因为没有文件。如果没有文件,我想将t2t3标记为成功。如何跳过接下来的两个任务。


我浏览了气流文档,其他文​​章也涉及传感器和戳戳方法。但是,不确定如何进行。

2 个答案:

答案 0 :(得分:6)

您可以利用SensorOperator更具体地说FileSensorOperator来检查文件是否存在。然后,当文件不存在时,可以使用soft_fail arg将任务标记为“已跳过”。这将使DAG成功执行,同时保持文件检查中发生的正确记录。

答案 1 :(得分:1)

@andscoop的答案很好,但这只是为了带来更多想法:

可能的解决方案1 ​​

我正在做类似的事情(依赖项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

enter image description here enter image description here

可能的解决方案2

分支。您可以通过更复杂的方式(并使用最佳做法)根据t1的结果进行分支以确定下一步/任务。我现在不能做一个合适的例子,但是这里有2个资料来理解它如何与例子一起工作: