我正在尝试使Airflow ExternalTaskSensor正常工作,但到目前为止还无法完成它,它似乎总是卡住运行并且从未完成,因此DAG可以继续进行下一个任务。
这是我用来测试的代码:
DEFAULT_ARGS = {
'owner': 'NAME',
'depends_on_past': False,
'start_date': datetime(2019, 9, 9),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False
}
external_watch_dag = DAG(
'DAG-External_watcher-Test',
default_args=DEFAULT_ARGS,
dagrun_timeout=timedelta(hours=1),
schedule_interval=None
)
start_op = DummyOperator(
task_id='start_op',
dag=external_watch_dag
)
trigger_external = TriggerDagRunOperator(
task_id='trigger_external',
trigger_dag_id='DAG-Dummy',
dag=external_watch_dag
)
external_watch_op = ExternalTaskSensor(
task_id='external_watch_op',
external_dag_id='DAG-Dummy',
external_task_id='dummy_task',
check_existence=True,
execution_delta=timedelta(minutes=-1),
# execution_date_fn=datetime(2019, 9, 25),
execution_timeout=timedelta(minutes=30),
dag=external_watch_dag
)
end_op = DummyOperator(
task_id='end_op',
dag=external_watch_dag
)
start_op >> trigger_external >> external_watch_op >> end_op
# start_op >> [external_watch_op, trigger_external]
# external_watch_op >> end_op
# Below is the setup for the dummy DAG that is called above by the Trigger and watched by the TaskSensor
dummy_dag = DAG(
'DAG-Dummy',
default_args=DEFAULT_ARGS,
dagrun_timeout=timedelta(hours=1),
schedule_interval=None
)
dummy_task = BashOperator(
task_id='dummy_task',
bash_command='sleep 10',
dag=dummy_dag
)
我尝试了多种方法来调整此代码,但使用ExternalTaskSensor并没有获得任何成功。
有人知道如何解决此问题并让ExternalTaskSensor正常工作吗?我还了解到,在使用ExternalTaskSensor时,可能会通过计划时间间隔出现问题,部分问题可能是DAG都具有schedule_interval=None
吗?
我已经将其与设置为完全相同的schedule_interval
的两个DAG一起使用,但是在生产中将无法使用。目标是定期安排主要DAG external-watch-dag ,并在运行过程中触发 DAG-Dummy ,并使用 DAG -虚拟本身有schedule_interval=None
。
非常感谢您的帮助。
答案 0 :(得分:0)
默认情况下,ExternalTaskSensor
将以与传感器DAG相同的执行日期来监视external_dag_id
。使用execution_delta
,您可以设置传感器dag和外部dag之间的时间增量,以便它可以寻找正确的execution_date
进行监视。当两个dag都按计划运行时,这非常有用,因为您确切地知道此时间增量。
问题:当手动触发或由其他dag触发dag时,您无法确定这两个dag中任意一个的确切执行日期。
解决方案:由于您使用的是TriggerDagRunOperator
,因此可以设置execution_date
参数。这将确保您的dag和外部dag的执行日期相同。来自docs:
execution_date(str或datetime.datetime)– dag的执行日期(模板)
因此您的代码将如下所示:
trigger_external = TriggerDagRunOperator(
task_id='trigger_external',
trigger_dag_id='DAG-Dummy',
dag=external_watch_dag,
execution_date="{{ execution_date }}", # Use the template to get the current execution date
)
external_watch_op = ExternalTaskSensor(
task_id='external_watch_op',
external_dag_id='DAG-Dummy',
external_task_id='dummy_task',
check_existence=True,
execution_timeout=timedelta(minutes=30),
dag=external_watch_dag
)