我使用Apache Airflow来管理数据处理管道。在管道中间,需要在下一步处理之前检查一些数据。例如
... -> task1 -> human review -> task2 -> ...
其中task1和task2是数据处理任务。当task1完成时,task1生成的数据需要由human查看。审阅者批准数据后,可以启动任务2。
人工审查任务可能需要很长时间(例如几周)。
我正在考虑使用外部数据库来存储人工审核结果。并使用Sensor按时间间隔查看审核结果。但是在审查完成之前,它将占用Airflow工作人员。
任何想法?
答案 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 answer和Robert 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