簡體   English   中英

在氣流 dag 中包含時間

[英]Include time in airflow dag

我在氣流新的,我想創建一個DAG,它運行每隔一小時,我們有一個過程importdata其進口的文件,隨后的過程sendReport這給我們一份報告,每天兩次在上午8點和下午6點。 我怎樣才能包括時間?

編輯:我錯過了你每天說兩次的問題部分。 請注意,您不能要求某事恰好在上午 8 點或下午 6 點發生,因為執行取決於系統資源。 DAG 可能實際上在8:20 : 08:32等運行......但是,由於我們正在安排每小時工作,我們知道應該在8AM9AM之間運行一次,因此我們將驗證是否滿足時間范圍以及是否滿足所以我們將執行sendReport 更新代碼:

import datetime
from airflow.models import DAG
from airflow.operators.dummy import DummyOperator
from airflow.operators.python import ShortCircuitOperator
from airflow.utils.edgemodifier import Label


def time_in_range(start, end, x):
    """Return true if x is in the range [start, end]"""
    if start <= end:
        return start <= x <= end
    else:
        return start <= x or x <= end


def shortcircuit_fn():
    return time_in_range(
        datetime.time(8, 0, 0),
        datetime.time(9, 0, 0),
        datetime.datetime.now().time(),
    ) or time_in_range(
        datetime.time(18, 0, 0),
        datetime.time(19, 0, 0),
        datetime.datetime.now().time(),
    )


with DAG(
    dag_id="with_short_circuit_twice_a_day",
    schedule_interval='@hourly',
    start_date=datetime.datetime(2021, 7, 17),
    catchup=False
) as dag:

    first_op = DummyOperator(task_id='importdata') # Replace with your operator
    short_op = ShortCircuitOperator(task_id='short_circuit',
                                    python_callable=shortcircuit_fn
                                    )
    send_op = DummyOperator(task_id='sendReport') # Replace with your operator

    first_op >> short_op >> Label("8<time<9 or 18<time<19") >> send_op

在時間窗口外執行: 在此處輸入圖片說明

在時間窗口中執行: 在此處輸入圖片說明

上一個答案:僅當您要發送所有8AM6PM 8AM之間運行的報告時,這才是相關的

有兩種方法可以獲得此功能。 您可以使用BranchDateTimeOperator檢查作業是否在所需的時間范圍內運行,如下所示:

import datetime
from airflow.models import DAG
from airflow.operators.dummy import DummyOperator
from airflow.operators.datetime import BranchDateTimeOperator
from airflow.utils.edgemodifier import Label

with DAG(
    dag_id="with_branching",
    schedule_interval='@hourly',
    start_date=datetime.datetime(2021, 7, 17),
    catchup=False
) as dag:

    first_op = DummyOperator(task_id='importdata') # Replace with your operator
    branch_op = BranchDateTimeOperator(
        task_id='branch',
        follow_task_ids_if_true='sendReport',
        follow_task_ids_if_false='do_nothing',
        target_upper=datetime.time(18, 0, 0),
        target_lower=datetime.time(8, 0, 0),
    )
    in_range_op = DummyOperator(task_id='sendReport') # Replace with your operator
    out_of_range_op = DummyOperator(task_id='do_nothing')

    first_op >> branch_op >> Label("8<time<18") >> in_range_op
    branch_op >> Label("rest of day") >> out_of_range_op

在時間窗口外執行:

在此處輸入圖片說明

在時間窗口中執行:

在此處輸入圖片說明

如果您需要在工作流的每個分支中實際執行不同的任務,這是一個很好的解決方案。 如果不是這種情況,那么您可能應該在該解決方案中使用ShortCircuitOperator的第二個選項,只有在滿足時間標准的情況下,工作流才會繼續發送sendReport如果不滿足標准,它將跳過:

import datetime
from airflow.models import DAG
from airflow.operators.dummy import DummyOperator
from airflow.operators.python import ShortCircuitOperator
from airflow.utils.edgemodifier import Label


def time_in_range(start, end, x):
    """Return true if x is in the range [start, end]"""
    if start <= end:
        return start <= x <= end
    else:
        return start <= x or x <= end


def shortcircuit_fn():
    return time_in_range(datetime.time(8, 0, 0),
                         datetime.time(18, 0, 0),
                         datetime.datetime.now().time(),
                         )


with DAG(
    dag_id="with_short_circuit",
    schedule_interval='@hourly',
    start_date=datetime.datetime(2021, 7, 17),
    catchup=False
) as dag:

    first_op = DummyOperator(task_id='importdata') # Replace with your operator
    short_op = ShortCircuitOperator(task_id='short_circuit',
                                    python_callable=shortcircuit_fn
                                    )
    send_op = DummyOperator(task_id='sendReport') # Replace with your operator

    first_op >> short_op >> Label("8<time<18") >> send_op

在時間窗口外執行:

在此處輸入圖片說明

在時間窗口中執行:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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