[英]Airflow: ExternalTaskSensor doesn't work as expected. Different task schedules
同事,我們需要幫助。 dag有Parent和Child,parent有自己的schedule,假設'30 * * * *',child '1 8-17 * * 1-5',child等待parent執行,比如40分鍾,如果parent以錯誤結束,然后子進程也因錯誤而崩潰,否則執行子進程 class 的下一個任務。 問題是即使在最簡單的情況下這也不起作用,我不明白如何同步它們。 我寫了這樣的代碼:
達格父母
import time
from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.python_operator import PythonOperator
from airflow.sensors.external_task_sensor import ExternalTaskSensor, ExternalTaskMarker
start_date = datetime(2021, 3, 1, 20, 36, 0)
class Exept(Exception):
pass
def wait():
time.sleep(3)
with open('etl.txt', 'r') as txt:
line = txt.readline()
if line == 'err':
print(1)
raise Exept
return 'etl success'
with DAG(
dag_id="dag_etl1",
start_date=start_date,
schedule_interval='* * * * *',
tags=['example2'],
) as etl1:
parent_task = ExternalTaskMarker(
task_id="parent_task",
external_dag_id="dag_etl1",
external_task_id="etl_child",
)
wait_timer = PythonOperator(task_id='wait_timer', python_callable=wait)
wait_timer >> parent_task
達格孩子
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.python_operator import PythonOperator
from airflow.sensors.external_task_sensor import ExternalTaskSensor, ExternalTaskMarker
from etl_parent import etl1, wait_timer, parent_task
start_date = datetime(2021, 3, 1, 20, 36, 0)
def check():
return 'I succeeded'
with DAG(
dag_id='etl_child',
start_date=start_date,
schedule_interval='* * * * *',
tags = ['testing_child_dag']
) as etl_child:
status = ExternalTaskSensor(
task_id="dag_etl1",
external_dag_id=etl1.dag_id,
external_task_id=parent_task.task_id,
allowed_states=['success'],
mode='reschedule',
execution_delta=timedelta(minutes=1),
timeout=60,
)
task1 = PythonOperator(task_id='task1', python_callable=check)
status >> task1
如您所見,如果在文本文件中指定 err 並在任何其他情況下成功,則我正在嘗試模擬父任務失敗的情況。 但這根本不像我預期的那樣工作,在 dag 的第一次啟動時一切都很好,它工作正常,如果我更改文本文件中的數據,那么父任務正常工作,例如,我啟動父dag 有一個明知的錯誤,一切都會正常工作,孩子 class 將以錯誤結束,但如果我更改文本,父母將再次正常工作,但孩子會繼續跌倒一段時間,那么它可能是正確的,但不是事實。 如果已知發射成功,情況是一樣的,正好相反。 另外,我不明白如何在父 dag 中組織等待任務完成。
請幫助)我最近一直在使用 airflow,我可能遺漏了一些東西。
ExternalTaskSensor 問題的最常見原因是 execution_delta 參數,所以我將從那里開始。
我看到父 dag 和子 dag 的 start_date 和 schedule_interval 完全相同,但您的 execution_delta 是 1 分鍾。 在這種情況下,您的子 dag 會查找從 20:35(在您的示例中)開始的父 dag,但它實際上是在 20:36 開始的,所以它失敗了。 即使測試嘗試將您的父 dag 設置為從 20:35 開始,看看它是否能解決問題。
這是一篇很好的文章,詳細介紹了 schedule_interval 陷阱https://medium.com/@fninsiima/sensing-the-completion-of-external-airflow-tasks-827344d03142
關於等待時間,這是您在 ExternalTaskSensor 中的超時參數。 在您的情況下,它會在失敗前等待 60 秒。 就個人而言,我會非常謹慎地設置較長的超時時間。 當您的傳感器正在等待時,它會占用一個工作人員,因此沒有其他任務可以使用它,這可能會導致您的其他任務被鎖定而無法執行,尤其是在您有很多傳感器的情況下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.