设置在两个DAG之间的上游

时间:2016-10-13 09:12:20

标签: python airflow

我有两个python文件(proc1.py和proc2.py)调用一些BaseOperator来进行一些处理。工作流程是这样的(简化了可读性):

proc1:
calculate1->calcualte2->end
def generate_proc1_dag(dag):
   run_this = BaseOperator()
   cal1 = Calculate1()
   cal1.set_upstream(run_this)
   cal2 = calcualte2()
   cal2.set_upstream(cal1)
   end = BaseOperator()
   end.set_upstream(cal2)
proc1_dag = DAG(dag_id='proc1', default_args=ARGS, schedule_interval=None)
generate_proc1_dag(proc1_dag)

proc2 (similar to proc1):
calcualteA->calcualteB->end

proc2.py的操作应该从proc1开始完成。结果,我尝试创建一个新的DAG(run_all.py),我尝试了这个:

def generate_run_all_dag(dag):
   run_this = BaseOperator()
   global proc1_dag
   global proc2_dag

   generate_proc1_dag(proc1_dag)
   proc1_dag.set_upstream(run_this)

   generate_proc2_dag(proc2_dag)
   proc2_dag.set_upstream(proc1_dag)

   end = BaseOperator()
   end.set_upstream(proc2_dag)

run_all_dag = DAG(...)
generate_run_all_dag(run_all_dag)

首先,我不是100%确定我可以像在run_all.py中那样使用set_upstream,但是,我不知道提到proc2应该在proc1之后启动的任何其他方式。

现在,当我使用它时,我得到以下异常:airflow.exceptions.AirflowException:试图在尚未拥有DAG的任务之间创建关系。为至少一项任务设置DAG,然后重试

非常感谢任何帮助。 注意: proc1和proc2独立工作,并且(如果可能)不应对它们进行任何更改。

1 个答案:

答案 0 :(得分:1)

您应该使用"ExternalTaskSensor"。所以你的proc2.py将包含这样的东西:

sensor = ExternalTaskSensor ( 
    task_id='proc2_sensor_task',
    external_dag_id='proc1',
    external_task_id='proc1_task_id',
    dag=dag
)

proc_2_task.set_upstream(sensor)

但是,要实现这一点,您需要定义' proc1_task_id'在Proc1.py中的proc1.py和proc_2_task。

我建议您在这里查看教程,了解如何完成此操作:https://airflow.incubator.apache.org/tutorial.html