簡體   English   中英

Airflow:ExternalTaskSensor 無法按預期工作。 不同的任務計划

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

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