气流ExternalTask​​Sensor卡住

时间:2019-09-25 15:05:52

标签: python airflow airflow-scheduler airflow-operator

我正在尝试使Airflow ExternalTask​​Sensor正常工作,但到目前为止还无法完成它,它似乎总是卡住运行并且从未完成,因此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
)

我尝试了多种方法来调整此代码,但使用ExternalTask​​Sensor并没有获得任何成功。

有人知道如何解决此问题并让ExternalTask​​Sensor正常工作吗?我还了解到,在使用ExternalTask​​Sensor时,可能会通过计划时间间隔出现问题,部分问题可能是DAG都具有schedule_interval=None吗?

我已经将其与设置为完全相同的schedule_interval的两个DAG一起使用,但是在生产中将无法使用。目标是定期安排主要DAG external-watch-dag ,并在运行过程中触发 DAG-Dummy ,并使用 DAG -虚拟本身有schedule_interval=None

非常感谢您的帮助。

1 个答案:

答案 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
)