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
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
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.
vous pouvez essayer d'utiliser crontab.gur si vous ne savez pas vraiment comment créer l'expression cron de flux d'air
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é.