Data Engineering

Débloquer les transactions ACID dans les Data Lakes : Une plongée approfondie dans Apache Hudi

Dans le paysage évolutif de l'ingénierie des données, l'architecture traditionnelle du data lake a rencontré un goulot d'étranglement critique : le manque de support natif pour les transactions ACID (Atomicité, Cohérence, Isolation, Durabilité). Bien que les data lakes offrent une évolutivité massive et un stockage à faible coût, ils peinent avec l'intégrité des données lorsque plusieurs écrivains tentent de modifier les données simultanément. Entre en scène Apache Hudi (Hadoop Upserts Deletes and Incrementals), un framework open-source qui résout ce problème en permettant des mises à jour de données efficaces et un traitement incrémental des données directement sur des systèmes de stockage distribués tels que HDFS, S3 et ADLS.

Quel problème Apache Hudi résout-il ?

Historiquement, si vous souhaitiez mettre à jour un enregistrement dans un fichier Parquet ou ORC stocké dans un data lake, vous deviez réécrire l'intégralité du fichier. Ce processus est coûteux en calcul et inefficace. Apache Hudi introduit le concept d'« Upserts » (Mise à jour + Insertion) et de « Suppressions » au niveau du fichier. Il gère ces changements en maintenant des métadonnées et en utilisant des formats de stockage efficaces, permettant des requêtes à un instant donné et une intégration continue des données.

En implémentant la Clé d'Enregistrement (Record Key) et le Chemin de Partition (Partition Path), Hudi peut identifier des enregistrements spécifiques au sein d'ensembles de données massifs, garantissant que seuls les fichiers nécessaires sont mis à jour plutôt que l'ensemble des données. Cette capacité est fondamentale pour la construction de data lakehouses modernes.

Concepts architecturaux principaux

Pour tirer parti efficacement de Hudi, les développeurs doivent comprendre ses composants principaux. Le système s'appuie sur quelques paramètres clés pour gérer l'ingestion des données :

  • Clé d'Enregistrement (Record Key) : Un identifiant unique pour chaque ligne (par exemple, user_id).
  • Chemin de Partition (Partition Path) : La structure de répertoires utilisée pour partitionner les données (par exemple, ds=2023-10-01).
  • Types d'opérations : Hudi prend en charge les opérations INSERT, UPSERT et DELETE.

Hudi prend en charge plusieurs types de tables, notamment Copy-On-Write (COW) et Merge-On-Read (MOR). Les tables COW sont optimisées pour les charges de travail à prédominance de lecture, où les mises à jour sont appliquées aux fichiers de base. Les tables MOR, en revanche, sont conçues pour les charges de travail à prédominance d'écriture, conservant les changements récents dans des fichiers journaux séparés afin de minimiser la latence d'écriture et de maximiser le débit.

Mise en œuvre pratique avec Spark

L'intégration d'Apache Hudi est transparente avec Apache Spark. Voici un exemple pratique de la manière d'enregistrer une table Hudi et d'effectuer une opération upsert en utilisant PySpark. Cet exemple montre comment écrire un DataFrame en tant que table Hudi, en spécifiant le type de table comme COW pour une performance de lecture optimisée.

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("HudiUpsertExample") \
    .getOrCreate()

# Données d'exemple à ingérer
data = [
    (1, "Alice", 30, "2023-10-01"),
    (2, "Bob", 25, "2023-10-01"),
    (3, "Charlie", 35, "2023-10-01")
]

df = spark.createDataFrame(data, ["id", "name", "age", "dt"])

# Définir les propriétés de la table pour Hudi
props = {
    "hoodie.table.name": "hudi_test_table",
    "hoodie.datasource.write.partitionpath.field": "dt",
    "hoodie.datasource.write.recordkey.field": "id",
    "hoodie.table.type": "COPY_ON_WRITE",
    "hoodie.datasource.write.operation": "upsert"
}

# Écrire le DataFrame dans Hudi
df.write \
    .format("hudi") \
    .options(**props) \
    .mode("overwrite") \
    .save("s3://my-bucket/data/hudi_table")

Voyage dans le temps et requêtes incrémentales

L'une des fonctionnalités les plus puissantes de Hudi est le « Voyage dans le temps » (Time Travel). Comme Hudi valide chaque changement, vous pouvez interroger l'état de vos données à n'importe quel moment du passé. Cela est inestimable pour déboguer les problèmes de qualité des données ou reproduire des états historiques sans maintenir de snapshots historiques séparés. De plus, Hudi permet des requêtes incrémentales, permettant aux processus en aval de récupérer uniquement les changements depuis la dernière ingestion, réduisant considérablement les coûts de traitement.

Conclusion

Apache Hudi comble le fossé entre les data lakes traditionnels et les exigences transactionnelles robustes de l'analyse moderne. En fournissant un support natif pour les upserts, les suppressions et le voyage dans le temps, il permet aux ingénieurs des données de construire des architectures de data lakehouse fiables, évolutives et rentables. Bien qu'il introduise une certaine complexité dans la configuration et la gestion, les avantages de la conformité ACID sur un stockage d'objets peu coûteux en font un choix attrayant pour les organisations traitant des jeux de données volumineux et fréquemment mis à jour.

Share: