2017-11-04 68 views
5

Jestem w strefie czasowej UTC + 4, więc kiedy przepływ powietrza wyzwala nocne ETL-y, jest już 4:00 tutaj. Jak mogę powiedzieć przepływowi powietrza, aby uruchomić przebieg dnia DS już na dzień ds-1 o 20:00, ale z ds = ds?Jak uruchamiać codzienne uruchamianie DAG o północy czasu lokalnego zamiast o północy Czas UTC

Według dokumentów zaleca się utrzymanie wszystkich serwerów w UTC, dlatego właśnie szukam rozwiązania na poziomie aplikacji.

EDYCJA: rozwiązaniem hakerskim jest zdefiniowanie go tak, aby działał codziennie o 20:00, więc "poprzedni" dzień, ale użyj tomorrow_ds zamiast ds w zadaniu. Ale to wciąż wygląda dziwnie na interfejsie Airflow, ponieważ to pokazuje czas wykonania UTC.

Odpowiedz

3

przedział Harmonogram może być również „wyrażenie cron”, który oznacza, że ​​można łatwo uruchomić go o godzinie 20:00 UTC. Który w połączeniu z "user_defined_filters" oznacza, że ​​można, przy odrobinie oszustwa uzyskać żądane zachowanie:

from airflow.models import DAG 
from airflow.operators.bash_operator import BashOperator 
from datetime import datetime 

import pytz 
tz = pytz.timezone('Asia/Dubai') 


def localize_utc_tz(d): 
    return tz.fromutc(d) 

default_args = { 
    'start_date': datetime(2017, 11, 8), 
} 
dag = DAG(
    'plus_4_utc', 
    default_args=default_args, 
    schedule_interval='0 20 * * *', 
    user_defined_filters={ 
     'localtz': localize_utc_tz, 
    }, 
) 
task = BashOperator(
     task_id='task_for_testing_file_log_handler', 
     dag=dag, 
     bash_command='echo UTC {{ ts }}, Local {{ execution_date | localtz }} next {{ next_execution_date | localtz }}', 
) 

This Wyjścia:

UTC 2017-11-08T20: 00: 00, lokalne 2017 -11-09 00: 00: 00 + 04: 00 następny 2017-11-10 00: 00: 00 + 04: 00

Musisz uważać na "typy" zmiennych, których używasz . Na przykład ds i ts są struny, nie datetime obiektów co oznacza, że ​​filtr nie będzie działać na nich

+0

nie zrobić wiele dla czasów podanych w Airflow UI niestety :( –

+0

Główny deweloper w zespole Airflow rozpoczął prace nad naprawieniem tego poprawnie, co oznacza, że ​​możesz zrobić "start_date = datetime (2017, 1, 1, tzinfo =" Europe/Amsterdam ")'. Zobacz https: // github. com/apache/incubator-airflow/pull/2781 do śledzenia tego, prawdopodobnie będzie w Airflow 1.10 –