簡體   English   中英

Airflow 外部任務傳感器卡住

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM