AccueilBlogTest technique Airflow avancé
Guide recrutement data

Test technique Airflow avancé : DAGs, XCom, TaskFlow, architecture

Airflow est l'orchestrateur de référence en data engineering. Mais beaucoup de profils se limitent aux DAGs basiques. Voici les concepts avancés qu'on teste pour valider un Data Engineer en production.

Data Builder·Juin 2025·8 min de lecture·Data Engineer

Airflow n'est pas un framework de traitement — c'est un orchestrateur. Comprendre cette distinction est la première chose qu'on vérifie en entretien. Un Data Engineer qui passe des datasets via XCom ou qui met de la logique métier dans ses DAGs n'a pas encore le niveau Senior.

1DAGs, opérateurs et structure

Question discriminante

Quelle est la différence entre un opérateur, un sensor et un task décorateur TaskFlow ? Dans quel cas utilisez-vous chacun ?

Un DAG (Directed Acyclic Graph) est un graphe orienté sans cycle. Il définit l'ordre d'exécution des tâches, leurs dépendances, leur scheduling — mais pas leur contenu métier. Le DAG est l'orchestrateur, pas le processeur.

from airflow import DAG from airflow.operators.python import PythonOperator from datetime import datetime with DAG( dag_id="mon_pipeline", start_date=datetime(2025, 1, 1), schedule_interval="@daily", catchup=False, max_active_runs=1, ) as dag: extract = PythonOperator( task_id="extraction", python_callable=extraire_donnees, ) transform = PythonOperator( task_id="transformation", python_callable=transformer_donnees, ) extract >> transform # dépendance : transform attend extract
  • Operators — tâches prédéfinies : PythonOperator, BashOperator, SparkSubmitOperator, etc.
  • Sensors — attendent un événement externe (S3FileSensor, HttpSensor, ExternalTaskSensor)
  • TaskFlow (@task) — fonctions Python décorées, passage automatique de valeurs via XCom
  • catchup=False — ne pas re-exécuter les runs passés au démarrage du DAG
  • max_active_runs — limite les exécutions concurrentes du même DAG

Bonne pratique : 1 tâche = 1 responsabilité. Un DAG qui fait extraction + transformation + chargement dans une seule tâche Python est un anti-pattern — il casse l'observabilité et le retry granulaire.

2TaskFlow API : le DAX moderne d'Airflow

Question discriminante

Quels sont les avantages de la TaskFlow API par rapport aux PythonOperators classiques ? Quelles sont ses limites ?

Introduite en Airflow 2.0, la TaskFlow API simplifie radicalement l'écriture des DAGs Python en supprimant le boilerplate XCom explicite.

from airflow.decorators import dag, task from datetime import datetime @dag(schedule_interval="@daily", start_date=datetime(2025, 1, 1), catchup=False) def mon_pipeline_taskflow(): @task def extraire() -> dict: return {"lignes": 1500, "source": "postgres"} @task def transformer(data: dict) -> dict: return {"lignes_traitees": data["lignes"], "source": data["source"]} @task def charger(data: dict): print(f"Chargement de {data['lignes_traitees']} lignes depuis {data['source']}") # Les dépendances sont inférées automatiquement charger(transformer(extraire())) mon_pipeline_taskflow()
  • Avantages — code plus lisible, XCom implicite, dépendances inférées automatiquement, moins de boilerplate
  • Limites — ne fonctionne qu'avec des fonctions Python, pas adapté aux opérateurs spécialisés (Spark, BigQuery, etc.)
  • Task Groups — grouper des tâches visuellement dans l'UI Airflow sans affecter l'exécution
  • Dynamic Task Mapping — générer dynamiquement le nombre de tâches selon les données

3XCom : communication entre tâches

Question discriminante

Airflow est-il un framework de traitement de données ? Pourquoi ne faut-il pas passer de datasets via XCom ?

XCom (cross-communication) permet aux tâches d'échanger des informations. C'est un mécanisme léger, pas un système de transfert de données.

# Push explicite dans un PythonOperator classique def ma_tache(**context): context['task_instance'].xcom_push(key='nb_lignes', value=1500) # Pull explicite def tache_suivante(**context): nb = context['task_instance'].xcom_pull(task_ids='ma_tache', key='nb_lignes') print(f"Reçu : {nb} lignes") # Avec TaskFlow : implicite, via le return @task def ma_tache() -> int: return 1500 # automatiquement pushé en XCom
  • Limite de taille — XCom est stocké dans la base de métadonnées Airflow (~1GB selon le backend)
  • Usage correct — passer des métadonnées (nombre de lignes, chemin S3, statut), pas des datasets
  • Usage incorrect — passer des DataFrames ou des fichiers entiers via XCom
  • Alternative — écrire les données dans S3/GCS et passer le chemin via XCom

Rappel fondamental : Airflow est un orchestrateur, pas un framework de traitement. Le traitement se fait dans Spark, dbt, ou les services cloud. Airflow déclenche et surveille — il ne traite pas.

4Control flow et trigger rules

Question discriminante

Qu'est-ce qu'une trigger rule et dans quel cas utilisez-vous none_failed_min_one_success ?

Par défaut, Airflow n'exécute une tâche que si toutes ses tâches amont ont réussi. Les trigger rules permettent de modifier ce comportement.

Trigger ruleCondition d'exécutionCas d'usage
all_successToutes les tâches amont ont réussi (défaut)Pipeline standard
all_failedToutes les tâches amont ont échouéNotification d'échec global
all_doneToutes les tâches amont sont terminées (succès ou échec)Nettoyage systématique
one_successAu moins une tâche amont a réussiTraitement dès qu'une source est disponible
none_failedAucune tâche amont n'a échoué (succès ou skipped)Tâche finale après branchement conditionnel
none_failed_min_one_successAucun échec + au moins un succèsAgrégation après branchement avec succès partiel
  • Branching — BranchPythonOperator pour exécuter une branche conditionnelle, les autres branches sont skippées
  • TriggerDagRunOperator — déclencher un autre DAG depuis un DAG
  • ShortCircuitOperator — court-circuiter toutes les tâches aval si une condition est fausse

5Architecture Airflow

Question discriminante

Quels sont les composants d'une architecture Airflow en production ? Quelle est la différence entre LocalExecutor et CeleryExecutor ?

Une installation Airflow en production comporte plusieurs composants distincts. Connaître l'architecture est indispensable pour déployer et déboguer.

  • Scheduler — scanne les DAGs, détermine quelles tâches lancer, soumet au executor
  • Executor — comment les tâches sont exécutées : LocalExecutor (même process), CeleryExecutor (workers distribués), KubernetesExecutor (pod par tâche)
  • Webserver — UI Airflow, inspection et déclenchement manuel des DAGs
  • Metadata database — stocke l'état des DAGs, tâches, XCom, connexions (PostgreSQL recommandé en prod)
  • Workers — processus qui exécutent les tâches (Celery/Kubernetes uniquement)

En production : LocalExecutor convient jusqu'à ~50 DAGs. Au-delà, CeleryExecutor ou KubernetesExecutor. MWAA (AWS Managed Airflow) et Cloud Composer (GCP) gèrent l'infrastructure automatiquement.

6Airflow en production : connexions, SLAs, monitoring

Question discriminante

Comment gérez-vous les credentials dans Airflow ? Pourquoi ne faut-il pas les coder en dur dans les DAGs ?

  • Connections — stocker les credentials dans la base de métadonnées Airflow, accessibles par conn_id dans les opérateurs
  • Secrets Backend — intégration avec AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault pour les credentials sensibles
  • Variables — paramètres de configuration non sensibles, modifiables sans redeployer le DAG
  • SLAs — définir un temps maximum d'exécution, déclencher une alerte si dépassé
  • Callbacks — on_failure_callback, on_success_callback, on_retry_callback pour les notifications Slack/PagerDuty
  • Pools — limiter la concurrence de certaines tâches (ex : ne pas saturer une base de données)

7Grille par niveau

NiveauMaîtrise attendueSignal GONO-GO
JuniorDAGs basiques, PythonOperator, scheduling, dépendances simplesComprend qu'Airflow est un orchestrateur, sait créer un DAG avec catchup=FalseConfond Airflow avec un framework de traitement, met de la logique métier dans le DAG
ConfirméTaskFlow API, XCom, trigger rules, branchement, connexionsUtilise TaskFlow, sait quand ne pas utiliser XCom, explique les trigger rulesNe connaît pas TaskFlow, passe des DataFrames via XCom
SeniorArchitecture executor, Secrets Backend, SLAs, dynamic task mappingCite CeleryExecutor vs KubernetesExecutor, a configuré un Secrets BackendNe sait pas expliquer la différence entre les executors
LeadArchitecture cloud (MWAA/Composer), standards équipe, CI/CD DAGsA migré vers MWAA ou Composer, a mis en place des tests automatisés sur les DAGsNe peut pas expliquer comment déployer Airflow en haute disponibilité

Vous recrutez un Data Engineer Airflow ?

Premier entretien gratuit. Rapport GO/NO-GO sous 48h.

Tester gratuitementRéserver un appel