AccueilBlogTest technique Prefect : orchestration moderne vs Airflow
Guide recrutement data

Test technique Prefect : orchestration moderne vs Airflow

Prefect est une alternative moderne à Airflow avec une meilleure developer experience. En entretien, on évalue la capacité à choisir entre les orchestrateurs et à architecturer des pipelines robustes.

Data Builder·Juin 2025·6 min de lecture·Data Engineer
Sommaire
  1. Pourquoi Prefect
  2. Flows et tasks
  3. Deployments et work pools
  4. Gestion des erreurs
  5. Airflow vs Prefect vs Dagster
  6. Monitoring et observabilité
  7. Grille

1Pourquoi Prefect est différent d'Airflow

Question discriminante

Quelle est la principale différence architecturale entre Prefect et Airflow ?

  • Airflow — DAG défini statiquement en Python, scheduler central qui planifie, workers qui exécutent. DAG doit être parseable sans erreur au chargement, même sans exécution
  • Prefect — flows définis en Python pur (décorations @flow/@task). L'exécution est découplée du scheduling. Prefect Cloud stocke les métadonnées, les workers exécutent localement
  • Avantages Prefect — moins de boilerplate, retry natif par task, state management avancé, testable localement sans infrastructure, inputs/outputs typés
  • Avantages Airflow — écosystème mature (400+ providers), plus répandu en entreprise, meilleure intégration avec les outils existants
  • Dagster — asset-centric (les données, pas les tâches). Idéal pour les équipes qui veulent raisonner en termes de data products
# Test unitaire d'un flow Prefect (impossible avec Airflow sans mocking lourd) from prefect import flow, task @task def extract(url: str) -> list: return requests.get(url).json() @flow def pipeline(url: str = "https://api.example.com"): data = extract(url) return data # Test simple en local - aucune infrastructure nécessaire if __name__ == "__main__": result = pipeline("https://api.example.com/orders") print(result)

2Flows et tasks : la syntaxe Prefect

Question discriminante

Comment convertissez-vous un script Python existant en flow Prefect ?

from prefect import flow, task from prefect.tasks import task_input_hash from datetime import timedelta @task( retries=3, retry_delay_seconds=60, cache_key_fn=task_input_hash, cache_expiration=timedelta(hours=1), tags=["extraction", "api"] ) def extract_data(source_url: str) -> list: response = requests.get(source_url, timeout=30) response.raise_for_status() return response.json() @task(log_prints=True) def transform(data: list) -> pd.DataFrame: df = pd.DataFrame(data) df = df[df['amount'] > 0] print(f"{len(df)} lignes après filtrage") return df @task def load(df: pd.DataFrame, table: str) -> int: df.to_sql(table, engine, if_exists='append', index=False) return len(df) @flow(name='pipeline-ventes', log_prints=True) def pipeline(source: str = 'https://api.example.com/orders'): data = extract_data(source) df = transform(data) n = load(df, 'orders') print(f'{n} lignes chargées') return n
  • Cache natif — task_input_hash met en cache le résultat selon les inputs. Si les inputs n'ont pas changé, la task est skippée
  • Tags — organiser et filtrer les runs dans l'UI. Utile pour les alertes par équipe
  • Subflows — un flow peut appeler un autre flow. Permet la composition de pipelines complexes

3Deployments et work pools

Question discriminante

Qu'est-ce qu'un Deployment Prefect ? Comment planifier l'exécution ?

from prefect.deployments import Deployment from prefect.server.schemas.schedules import CronSchedule # Créer un déploiement avec CRON deployment = Deployment.build_from_flow( flow=pipeline, name='pipeline-ventes-quotidien', schedule=CronSchedule(cron='0 6 * * *', timezone='Europe/Paris'), work_pool_name='mon-pool-gcp', parameters={'source': 'https://api.example.com/orders'}, tags=['production', 'ventes'] ) deployment.apply() # Types de work pools : # Process → exécution locale (dev/test) # Docker → conteneur Docker isolé # Kubernetes → pod K8s avec autoscaling # Cloud Run → GCP serverless (facturation à l'usage) # ECS → AWS serverless
  • Work pool — définit l'infrastructure d'exécution. Un même flow peut être déployé sur plusieurs pools (dev, staging, prod)
  • Worker — process qui interroge le pool et exécute les flows. Tourne en local ou dans un cluster
  • Prefect Cloud vs self-hosted — Prefect Cloud (SaaS) gère le serveur. Self-hosted : déployer prefect server soi-même

4Gestion des erreurs et retry

Question discriminante

Comment gérez-vous les erreurs dans Prefect ? En quoi est-ce plus puissant qu'Airflow ?

from prefect.tasks import exponential_backoff @task( retries=3, retry_delay_seconds=exponential_backoff(backoff_factor=10), # 10s, 100s, 1000s retry_jitter_factor=0.5 # évite les retry storms ) def call_external_api(url: str) -> dict: ... # State handlers : réagir aux changements d'état from prefect import flow from prefect.states import Failed def notify_on_failure(flow, flow_run, state): if isinstance(state, Failed): send_slack_alert(f"Flow {flow_run.name} a échoué : {state.message}") @flow(on_failure=[notify_on_failure]) def pipeline(): ...
  • Exponential backoff — évite de surcharger une API en panne en espaçant exponentiellement les retries
  • State handlers — déclencher des actions (Slack, PagerDuty, email) selon l'état du flow ou de la task
  • Resume depuis un checkpoint — reprendre un flow échoué depuis la dernière task réussie sans tout relancer
  • Automations Prefect Cloud — règles événementielles : si flow échoue 3 fois → créer un incident Opsgenie

5Airflow vs Prefect vs Dagster

Question discriminante

Comment choisissez-vous votre orchestrateur selon le contexte ?

AirflowPrefectDagster
ParadigmeDAG-centric (tâches)Flow-centric (Python pur)Asset-centric (données)
Courbe apprentissageÉlevéeFaibleMoyenne
ÉcosystèmeMature, 400+ providersCroissantCroissant
Developer experienceMoyenExcellentExcellent
Data assetsNon natifPartielNatif
Test localDifficileTrès facileFacile
Idéal pourÉquipes existantes, beaucoup de providersNouveaux projets Python-firstTeams data-asset oriented

6Monitoring et observabilité

Question discriminante

Comment monitorez-vous vos flows Prefect en production ?

  • Prefect Cloud dashboard — vue centralisée de tous les runs, filtrage par flow/tag/état, logs centralisés avec recherche full-text
  • Automations — déclencher des actions (Slack, email, webhook) quand un flow échoue, dépasse son SLA ou réussit trop rarement
  • Work pool monitoring — surveiller la santé des workers (queue depth, dernière activité)
  • Intégration Prometheus/Grafana — exporter les métriques Prefect (runs, latence, taux d'échec) via un exporter dédié
  • Alertes SLA — configurer des alertes si un flow tarde plus de N minutes après son heure planifiée
  • Work pool - definit l infrastructure d execution. Un meme flow peut etre deploye sur plusieurs pools (dev, staging, prod)
  • Automations Prefect Cloud - regles evenementielles : si flow echoue 3 fois -> creer un incident Opsgenie. Remplace les scripts de monitoring manuels
  • State handlers - declencher des actions (Slack, PagerDuty, email) selon l etat du flow ou de la task. on_failure, on_completion, on_cancellation
  • SLA monitoring - alertes si un flow tarde plus de N minutes apres son heure planifiee. Configurable par deployment
  • prefect serve vs deployment - prefect serve : lancer directement depuis Python (dev, pas de work pool). Deployment : config persistante avec scheduling CRON (prod)

7Grille par niveau

NiveauMaîtriseSignal GONO-GO
ConfirméFlows et tasks, déploiements, retry basique, scheduling CRONA transformé un script Python en flow Prefect, sait déployer avec un CRON et un work poolN'a jamais utilisé d'orchestrateur, confond Prefect et Airflow
SeniorWork pools, state handlers, automations, comparaison orchestrateursJustifie le choix d'orchestrateur selon le contexte, a configuré des automations et alertes SLANe sait pas expliquer la différence architecturale entre Airflow et Prefect

Vous recrutez un Data Engineer ?

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