[英]Airflow ExternalTaskSensor Stuck
我正在嘗試讓 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
?
我已經讓這兩個 DAG 都設置為完全相同的schedule_interval
,但這在生產中不起作用。 目標是讓主 DAG、 external-watch-dag定期運行,並在運行期間觸發該DAG-Dummy ,而DAG-Dummy本身具有schedule_interval=None
。
任何幫助是極大的贊賞。
默認情況下, ExternalTaskSensor
Sensor 將使用與傳感器 DAG 相同的執行日期監視external_dag_id
。 使用execution_delta
,您可以設置傳感器 dag 和外部 dag 之間的時間增量,以便它可以尋找正確的execution_date
進行監控。 當兩個 dag 都按計划運行時,這很有效,因為您確切地知道這個 timedelta。
問題:當手動或由另一個 dag 觸發 dag 時,您無法確定這兩個 dag 中任何一個的確切執行日期。
解決方案:因為您使用的是TriggerDagRunOperator
,您可以設置execution_date
參數。 這將確保您的 dag 和外部 dag 的執行日期相同。 從文檔:
execution_date (str or 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
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.