Planifier l'exécution d'un DAG et maîtriser les intervalles

@joekakone

Joseph Konka @joekakone

03/03/2026 · 9 min

Comprenez les mécanismes de planification d'Apache Airflow : syntaxe Cron, presets, data intervals, logical dates et gestion du paramètre catchup.

La planification automatique des flux de travail est la raison d'être première d'un orchestrateur de données. Pourtant, c'est aussi le sujet qui engendre le plus d'incompréhension chez les développeurs débutant sur Airflow : « Pourquoi mon DAG quotidien configuré pour démarrer le 1er janvier ne s'est-il déclenché que le 2 janvier à minuit ? »

Pour concevoir des pipelines fiables, il est indispensable de maîtriser la notion d'intervalles de données (Data Intervals) et les règles de syntaxe temporelle.


1. La syntaxe Cron standard#

Airflow s'appuie sur la syntaxe classique des tâches planifiées UNIX (Crontab) composée de cinq champs obligatoires :

┌───────────── Minute (0 - 59)
│ ┌───────────── Heure (0 - 23)
│ │ ┌───────────── Jour du mois (1 - 31)
│ │ │ ┌───────────── Mois (1 - 12)
│ │ │ │ ┌───────────── Jour de la semaine (0 - 6, Dimanche = 0 ou 7)
│ │ │ │ │
* * * * *

Caractères spéciaux indispensables#

  • * (Astérisque) : Toutes les valeurs possibles (chaque minute, chaque heure...).
  • , (Virgule) : Liste de valeurs discrètes (ex. : 1,15,30 pour les jours 1, 15 et 30 du mois).
  • - (Tiret) : Plage de valeurs continues (ex. : 1-5 dans le champ jour de la semaine pour du lundi au vendredi).
  • / (Barre oblique) : Pas ou fréquence d'intervalle (ex. : */10 dans le champ minute pour toutes les 10 minutes).
Expression Cron Fréquence d'exécution en français
0 6 * * * Tous les jours à 06h00 du matin
30 2 * * 1 Tous les lundis à 02h30 du matin
0 */4 * * * Toutes les 4 heures à la minute 0 (00h00, 04h00, 08h00, 12h00...)
0 0 1 * * Le 1er jour de chaque mois à minuit
0 9-18 * * 1-5 Toutes les heures de 09h00 à 18h00, uniquement les jours ouvrés

[!TIP] Pour concevoir et tester vos expressions régulières Cron sans risque d'erreur, utilisez l'outil interactif en ligne Crontab.guru.


2. Les raccourcis prédéfinis d'Airflow (Presets)#

Pour éviter d'écrire des expressions cryptiques, Airflow fournit des alias prêts à l'emploi :

Preset Airflow Équivalent Cron Moment d'exécution
None Aucun Le DAG n'est jamais déclenché automatiquement (déclenchement manuel ou via API externe).
@once Aucun S'exécute une seule et unique fois lors de l'activation du DAG.
@hourly 0 * * * * Chaque heure à la minute 0.
@daily 0 0 * * * Chaque jour à minuit.
@weekly 0 0 * * 0 Chaque dimanche à minuit.
@monthly 0 0 1 * * Le premier jour du mois à minuit.
@yearly / @annually 0 0 1 1 * Le 1er janvier à minuit.
Exemple d'utilisation dans le DAG
from airflow import DAG
from datetime import datetime

with DAG(
    dag_id="reporting_journalier",
    start_date=datetime(2026, 1, 1),
    schedule="@daily",  # Raccourci Airflow moderne (remplace schedule_interval)
    catchup=False,
) as dag:
    pass

[!NOTE] Depuis Airflow 2.4, le paramètre schedule_interval est formellement déprécié au profit du paramètre plus lisible schedule.


3. Le secret d'Airflow : Data Intervals et Logical Date#

C'est la spécificité la plus déroutante d'Airflow comparé à un ordonnanceur classique.

Dans un système cron ordinaire, une tâche planifiée à @daily démarre le 15 mars à 00h00 pour traiter les données qui vont arriver. Airflow fonctionne à l'inverse : il traite des périodes complètes et closes.

sequenceDiagram
    autonumber
    Note over Airflow,Horloge: Intervalle de Données : [2026-03-15 00:00:00, 2026-03-16 00:00:00]
    Horloge->>Airflow: Le temps passe... Journée du 15 Mars
    Horloge->>Airflow: 2026-03-16 00:00:00 atteint ! (Fin de la journée du 15 Mars)
    Note over Airflow: L'intervalle du 15 Mars est désormais clos et complet !
    Airflow->>Airflow: Déclenchement effectif du DAG Run du 15 Mars

Pourquoi ce comportement ?#

Dans un entrepôt de données, pour agréger les ventes du 15 mars, il faut impérativement attendre que la journée du 15 mars soit totalement terminée. Le calcul des ventes du 15 mars ne peut donc légitimement démarrer que le 16 mars à 00h00.

Dans Airflow : - data_interval_start : Début de la période couverte par la tâche (ex. : 2026-03-15 00:00). - data_interval_end : Fin de la période et heure réelle de déclenchement de la tâche (ex. : 2026-03-16 00:00). - logical_date (anciennement execution_date) : Identifie l'étiquette logique de la période traitée, c'est-à-dire data_interval_start.


4. Le piège du paramètre Catchup#

Le paramètre catchup (rattrapage historique) contrôle ce qui se produit lorsque la date de début (start_date) d'un DAG est antérieure à la date actuelle.

flowchart TD
    subgraph Scenario["start_date = 2026-01-01 / Aujourd'hui = 2026-03-01 (60 jours d'écart)"]
        CHOIX{"catchup = ?"}
        CHOIX -->|catchup = True| TRUE["<b>Rattrapage Massif</b><br>Airflow crée et lance immédiatement<br>60 DAG Runs consécutifs pour combler le retard !"]
        CHOIX -->|catchup = False| FALSE["<b>Exécution Récente Uniquement</b><br>Airflow ignore le passé et n'exécute<br>que l'intervalle le plus récent."]
    end
    style Scenario fill:#f1f5f9,stroke:#475569
    style TRUE fill:#fee2e2,stroke:#ef4444,stroke-width:2px,color:#0f172a
    style FALSE fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#0f172a

[!WARNING] En environnement de développement, définissez toujours catchup=False dans vos DAGs ! Si vous laissez la valeur par défaut (True) avec une start_date située un an dans le passé, Airflow tentera de lancer des centaines de conteneurs simultanément, ce qui saturera instantanément la mémoire de votre machine et bloquera le cluster.


5. Ordonnancement moderne piloté par les Datasets#

Depuis Airflow 2.4, vous n'êtes plus contraint de caler vos pipelines sur des heures fixes arbitraires. Vous pouvez programmer un DAG pour qu'il se déclenche dès qu'un jeu de données cible est mis à jour par un autre DAG :

dags/dataset_driven_dag.py
from airflow import DAG, Dataset
from airflow.operators.empty import EmptyOperator
from datetime import datetime

# Déclaration d'un identifiant de ressource de données (URI)
dataset_ventes = Dataset("s3://mon-entrepot-data/ventes_brutes.parquet")

# DAG Producteur : Signale quand la donnée a été écrite
with DAG(
    dag_id="dag_producteur",
    start_date=datetime(2026, 1, 1),
    schedule="@daily",
    catchup=False,
) as dag1:
    EmptyOperator(
        task_id="extraire_et_sauvegarder",
        outlets=[dataset_ventes],  # Met à jour le dataset à la fin de la tâche
    )

# DAG Consommateur : Se déclenche instantanément dès que le producteur a terminé !
with DAG(
    dag_id="dag_consommateur",
    start_date=datetime(2026, 1, 1),
    schedule=[dataset_ventes],  # Déclenchement réactif sur événement
    catchup=False,
) as dag2:
    EmptyOperator(task_id="generer_rapport_bi")

Vous maîtrisez désormais le temps et les fréquences d'exécution dans Airflow. Dans la leçon suivante, nous allons apprendre à déclencher nos DAGs manuellement, à relancer des tâches échouées et à exécuter des rattrapages historiques (Backfill) !

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue