Depuis plus d'une décennie, Apache Airflow est le roi incontesté de l'orchestration de données. Cependant, à mesure que les piles de données évoluent du traitement par lots simple vers les flux en temps réel, les magasins de fonctionnalités et les architectures lakehouse, le modèle DAG traditionnel « basé sur les tâches » est souvent perçu comme encombrant. De nombreuses équipes d'ingénierie se tournent désormais vers la prochaine génération d'outils d'orchestration, en particulier Dagster et Prefect. Les deux offrent des interfaces modernes, des capacités cloud-native et un passage vers des flux de travail centrés sur les actifs. Mais lequel correspond aux besoins de votre équipe ? Cet article explore les différences architecturales, les paradigmes de codage et les implications pratiques du choix entre ces deux étoiles montantes.
Le changement de paradigme : Tâches vs. Actifs
La principale différence entre ces outils modernes et Airflow est le passage des tâches aux actifs. Dans Airflow, vous définissez un pipeline comme une séquence d'opérations (tâches) qui transforment les données. Les données elles-mêmes sont souvent un sous-produit implicite. Dans Dagster, en revanche, l'Actif est l'unité de définition principale. Vous décrivez les données que vous souhaitez produire (par exemple, sales_by_region), et le cadre détermine comment les calculer et gérer leur fraîcheur.
Prefect adopte une approche similaire mais légèrement différente, se concentrant sur les flux et les tâches, mais avec un modèle d'exécution Pythonique beaucoup plus flexible qui prend en charge l'exécution hybride (locale et cloud) et s'intègre parfaitement avec des bibliothèques comme pandas, SQL et Spark, sans enveloppes strictes.
Dagster : L'approche centrée sur les actifs
Dagster est conçu pour les organisations qui souhaitent une lignée de données stricte et une observabilité. Son modèle basé sur les actifs vous permet de visualiser exactement quels actifs sont obsolètes, quels sont frais et comment ils dépendent les uns des autres, quel que soit le nombre de pipelines qui les produisent.
Voici un exemple simple de définition d'un actif dans Dagster :
import pandas as pd
import dagster as dg
@dg.asset
def raw_sales_csv() -> str:
# Simule la récupération de données brutes
return "s3://bucket/raw_sales.csv"
@dg.asset
def cleaned_sales_df(raw_sales_csv: str) -> pd.DataFrame:
# Dagster transmet automatiquement la sortie de raw_sales_csv
# comme argument si les noms correspondent ou via InputContext
df = pd.read_csv(raw_sales_csv)
return df.dropna()
@dg.asset
def sales_by_region(cleaned_sales_df: pd.DataFrame) -> pd.DataFrame:
return cleaned_sales_df.groupby('region').sum()
Remarquez que nous ne définissons pas explicitement les dépendances. Dagster infère la lignée en se basant sur les arguments de la fonction. Cela rend le refactoring des pipelines beaucoup plus facile, car vous découplez le calcul de la structure des données.
Prefect : Flexibilité et expérience développeur
Prefect privilégie l'expérience développeur et la flexibilité. Il fonctionne le mieux lorsque vous souhaitez garder votre code simple, en Python standard. Le moteur « fluvio » de Prefect permet une concurrence sophistiquée et une gestion des erreurs dès l'installation. Il accorde également une forte importance à l'exécution hybride, ce qui signifie que vous pouvez exécuter votre logique d'orchestration dans Prefect Cloud tandis que le calcul effectif se produit sur votre propre infrastructure.
Voici à quoi ressemble la même logique dans Prefect :
import pandas as pd
from prefect import flow, task
from prefect.filesystems import S3
@task
def fetch_raw_sales() -> str:
return "s3://bucket/raw_sales.csv"
@task
def clean_sales(file_path: str) -> pd.DataFrame:
df = pd.read_csv(file_path)
return df.dropna()
@task
def aggregate_sales(df: pd.DataFrame) -> pd.DataFrame:
return df.groupby('region').sum()
@flow(name="Sales Pipeline")
def sales_pipeline():
file_path = fetch_raw_sales()
cleaned_df = clean_sales(file_path)
result = aggregate_sales(cleaned_df)
return result
L'API de Prefect est très intuitive pour les développeurs familiers avec le script Python standard. Elle offre une gestion d'état puissante et des nouvelles tentatives sans imposer un registre d'actifs rigide.
Points clés à considérer pour la sélection
- Lignée et Gouvernance : Choisissez Dagster si vous avez besoin de catalogage de données de niveau entreprise, de vérifications de fraîcheur automatisées et de résolution de dépendances complexes entre plusieurs équipes.
- Flexibilité et Vitesse : Choisissez Prefect si votre équipe valorise le prototypage rapide, la logique Python complexe ou a besoin d'orchestrer des tâches non liées aux données (par exemple, inférence ML, appels d'API) aux côtés des pipelines de données.
- Intégration de l'écosystème : Dagster a des intégrations natives plus profondes avec dbt et les entrepôts de données. Prefect a d'excellentes intégrations avec les outils MLOps et les fournisseurs cloud.
Conclusion
Passer au-delà d'Airflow ne consiste pas seulement à changer d'outils ; c'est changer votre modèle mental. Si votre point de douleur est « Je ne sais pas quelles données sont obsolètes ou comment elles ont été produites », l'approche basée sur les actifs de Dagster vous fera probablement gagner un temps considérable. Si votre point de douleur est « Airflow est trop rigide pour mes flux de travail Python complexes », Prefect offre une alternative plus légère et plus flexible. Les deux sont d'excellents choix pour l'ingénierie de données moderne, et la décision dépend ultimement de ce que vous privilégiez : la lignée des données (Dagster) ou la flexibilité du développeur (Prefect).