如何在Apache Airflow Dag

时间:2018-02-02 10:09:59

标签: airflow

我使用Apache Airflow来管理数据处理管道。在管道中间,需要在下一步处理之前检查一些数据。例如 ... -> task1 -> human review -> task2 -> ... 其中task1和task2是数据处理任务。当task1完成时,task1生成的数据需要由human查看。审阅者批准数据后,可以启动任务2。 人工审查任务可能需要很长时间(例如几周)。

我正在考虑使用外部数据库来存储人工审核结果。并使用Sensor按时间间隔查看审核结果。但是在审查完成之前,它将占用Airflow工作人员。

任何想法?

4 个答案:

答案 0 :(得分:1)

你的想法对我来说似乎很好。您可以使用传感器创建专用DAG以检查批准过程的进度。如果您在传感器上使用低超时并在此DAG上使用适当的时间表,请说每6小时一次。使其适应这些任务被批准的频率以及您需要多久执行下游任务。

答案 1 :(得分:0)

一位同事建议执行一项总是会失败的任务,因此手动操作只是将其标记为成功。我是这样实现的:

def always_fail():
    raise AirflowException('Please change this step to success to continue')


manual_sign_off = PythonOperator(
    task_id='manual_sign_off',
    dag=dag,
    python_callable=always_fail
)

start >> manual_sign_off >> end

答案 2 :(得分:0)

在1.10之前,我使用运算符的重试功能来实现ManualSignOffTask。操作员已设置重试和retry_delay。因此,任务将在失败后重新安排。计划任务后,它将检查数据库以查看是否已完成签核: 如果尚未完成签核,则该任务将失败并释放工作线程并等待下一个计划。 如果已经完成签核,则任务成功,并且dag运行继续。

1.10之后,引入了新的TI状态UP_FOR_RESCHEDULE,并且Sensor本身支持长时间运行的任务。

答案 3 :(得分:0)

Freedom's answerRobert Elliot's answer的小猪打包,这是一个完整的工作示例,使用户有两个星期的时间来检查第一个任务的结果,然后永久失败:

from datetime import timedelta

from airflow.models import DAG
from airflow import AirflowException
from airflow.operators.python_operator import PythonOperator

from my_tasks import first_task_callable, second_task_callable


TIMEOUT = timedelta(days=14)


def task_to_fail():
    raise AirflowException("Please change this step to success to continue")


dag = DAG(dag_id="my_dag")

first_task = PythonOperator(
    dag=dag,
    task_id="first_task",
    python_callable=first_task_callable
)

manual_sign_off = PythonOperator(
    dag=dag,
    task_id="manual_sign_off",
    python_callable=task_to_fail,
    retries=1,
    max_retry_delay=TIMEOUT
)

second_task = PythonOperator(
    dag=dag,
    task_id="second_task",
    python_callable=second_task_callable
)

first_task >> manual_sign_off >> second_task