在Airflow中具有多个依赖项的ExternalTask​​Sensor

时间:2019-08-02 01:17:44

标签: airflow airflow-scheduler

我有dagA(凌晨5点)和dagB(凌晨6点)。这两个都从某处提取数据并将其转储到数据湖中。现在,我希望dagC(一个ETL作业)等待dagA和dagB都完成。

我使用的是ExternalTaskSensor而不是TriggerDagRunOperator,因为我不认为提取层会触发任何下游事件。我已经读过similar questions并指出我应该同时运行这些dag。

现在,这部分让我感到困惑,因为如果我遵循这一点,这是否意味着我所有的气流工作都将同时开始,而下游工作将继续戳直到上游准备就绪?这是否也意味着dagA和dagB即使彼此之间没有依赖性也必须同时启动?

dagA = DAG('dagA', description='dagA',
          schedule_interval='0 5 * * *',
          start_date=datetime(2017, 3, 20), catchup=False)
dagB = DAG('dagB', description='dagB',
          schedule_interval='0 6 * * *',
          start_date=datetime(2017, 3, 20), catchup=False)
dagC = DAG('dagC', description='dagC',
          schedule_interval=None,
          start_date=datetime(2017, 3, 20), catchup=False)

wait_for_dagA = ExternalTaskSensor(
    task_id='wait_for_dagA',
    external_dag_id='dagA',
    external_task_id=None,
    execution_delta=None,
    dag=dag)

wait_for_dagB = ExternalTaskSensor(
    task_id='wait_for_dagB',
    external_dag_id='dagB',
    external_task_id=None,
    execution_delta=None,
    dag=dag)

[wait_for_dagA, wait_for_dagB] >> etl_task 

我的气流为1.10.3。

1 个答案:

答案 0 :(得分:1)

  

..这是否意味着我所有的气流工作将同时开始,并且   下游工作不断戳,直到上游准备就绪?

  • 仅当您需要时,气流作业才会同时启动(但没有这样的要求)。
  • 下游作业(etl_task及其下游依赖项)将仅在wait_for_dagAwait_for_dagB都成功发布后开始。这些等待的任务将继续戳(传感器将执行此操作),直到各个DAG成功。

  

这是否也意味着dagA和dagB甚至必须同时开始   尽管他们彼此之间没有依赖性?

如上所述,这不是必需的。将cron替换为DAG的整个想法是,您不需要准确地定时任务;相反,您可以灵活地强制它们一个接一个地运行,而不管启动时间,执行时间和意外延迟如何。


提示

  • 但是请看一下mode param
  • 可以配置的不同戳入行为
  • 还可以在ExternalTaskSensor中检出available params
  • 如果您未在传感器中指定external_task_id,请当心诸如this之类的陷阱