我有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。
答案 0 :(得分:1)
..这是否意味着我所有的气流工作将同时开始,并且 下游工作不断戳,直到上游准备就绪?
etl_task
及其下游依赖项)将仅在wait_for_dagA
和wait_for_dagB
都成功发布后开始。这些等待的任务将继续戳(传感器将执行此操作),直到各个DAG成功。这是否也意味着dagA和dagB甚至必须同时开始 尽管他们彼此之间没有依赖性?
如上所述,这不是必需的。将cron
替换为DAG
的整个想法是,您不需要准确地定时任务;相反,您可以灵活地强制它们一个接一个地运行,而不管启动时间,执行时间和意外延迟如何。
提示
mode
param ExternalTaskSensor
中检出available params external_task_id
,请当心诸如this之类的陷阱