web-dev-qa-db-fra.com

Comment fonctionner correctement airflow schedule_interval

Je veux essayer d'utiliser Airflow au lieu de Cron. Mais Schedule_interval ne fonctionne pas comme prévu.

J'ai écrit le code python comme ci-dessous.
Et à ma connaissance, Airflow aurait dû fonctionner le "2016/03/30 8:15:00" mais cela n'a pas fonctionné à ce moment-là.

Si je l'ai changé comme ceci "'schedule_interval': timedelta (minutes = 5)", cela a fonctionné correctement, je pense.

Le "notice_slack.sh" est juste pour appeler l'api slack à mes canaux.

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
from airflow.operators import BashOperator
from airflow.models import DAG
from datetime import datetime, timedelta

args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2016, 3, 29, 8, 15),
}

dag = DAG(
    dag_id='notice_slack',
    default_args=args,
    schedule_interval="@daily",
    dagrun_timeout=timedelta(minutes=1))

# cmd file name
CMD = '/tmp/notice_slack.sh'

run_this = BashOperator(
    task_id='run_transport', bash_command=CMD, dag=dag)

Je veux exécuter certains de mes scripts à une heure précise chaque jour, comme ce paramètre cron.

15 08 * * * bash /tmp/notice_slack.sh

J'ai lu le document Scheduling & Triggers , et je sais que c'est un peu différent.
J'essaie donc d'organiser les paramètres "start_date" et "schedule_interval".

Est-ce que quelqu'un sait que dois-je faire?

version airflow

INFO - Utilisation de l'exécuteur LocalExecutor

v1.7.0

Amazon-linux-AMI/2015.09-release-notes

10
k16

Airflow démarrera votre DAG lorsque l'intervalle de programmation 2016/03/30 8:15:00 + (quotidien) sera dépassé. Votre DAG s'exécutera donc le 31/03/2016 à 8:15:00.

Vous pouvez vérifier Airflow FAQ

12
p.magalhaes

Essaye ça:

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
from airflow.operators import BashOperator
from airflow.models import DAG
from datetime import datetime, timedelta

args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2016, 3, 29),
}

dag = DAG(
    dag_id='notice_slack',
    default_args=args,
    schedule_interval="15 08 * * *",
    dagrun_timeout=timedelta(minutes=1))

# cmd file name
CMD = 'bash /tmp/notice_slack.sh'

run_this = BashOperator(
    task_id='run_transport', bash_command=CMD, dag=dag)

start_date (datetime) - La date_début de la tâche, détermine la date d'exécution pour la première instance de tâche. La meilleure pratique consiste à arrondir la date de début à l'intervalle de programmation de votre DAG.

schedule_interval (datetime.timedelta ou dateutil.relativedelta.relativedelta ou str qui agit comme une expression cron) - Définit la fréquence à laquelle DAG s'exécute, cet objet timedelta est ajouté à la date d'exécution_date de votre dernière instance de tâche pour déterminer la prochaine planification.

Configurer simplement le schedule_interval et bash_command la même chose dans votre paramètre cron est correcte.

10
ansvver

vous pouvez essayer d'utiliser crontab.gur si vous ne savez pas vraiment comment créer l'expression cron de flux d'air

2

Avec l'exemple que vous avez donné, @daily Exécutera votre travail après minuit. Vous pouvez essayer de le changer en timedelta(days=1) qui est relatif à votre start_date Fixe qui inclut 08:15. Ou vous pouvez utiliser une spécification cron pour le schedule_interval='15 08 * * *' Auquel cas toute date de début avant 8h15 le jour AVANT le jour où vous vouliez que la première exécution fonctionne.

Notez que depends_on_past: False Est déjà la valeur par défaut, et vous avez peut-être confondu son comportement avec catchup=false Dans les paramètres DAG, ce qui éviterait de faire des exécutions antérieures pendant la durée entre la date de début et maintenant où la planification DAG l'intervalle aurait fonctionné.

0
dlamblin