How-To Guides

Maîtriser le Data Lake moderne : Comment installer et configurer Apache Iceberg

Apache Iceberg est rapidement devenu la norme pour les formats de tables ouverts dans l'écosystème Big Data. En fournissant des transactions ACID, l'évolution de schéma et la gestion des versions directement sur les data lakes, Iceberg comble le fossé entre la flexibilité d'un data lake et la fiabilité d'un entrepôt de données. Cependant, se lancer avec Iceberg peut être intimidant en raison des divers composants et dépendances impliqués.

Ce guide propose un parcours complet pour les développeurs intermédiaires et avancés sur la manière d'installer et de configurer Apache Iceberg en utilisant Apache Spark, l'un des moteurs les plus courants pour le traitement des tables Iceberg. Nous couvrirons les prérequis, l'installation des dépendances et la création de votre première table.

Prérequis et configuration de l'environnement

Avant de commencer l'installation, assurez-vous que votre environnement répond aux exigences suivantes :

  • JDK 1.8 ou supérieur : Iceberg prend en charge Java 8+, mais Java 11 ou 17 est recommandé pour les performances.
  • Apache Spark 3.x : Nous utiliserons Spark 3.3+ pour cet exemple, car il offre une meilleure intégration native avec Iceberg.
  • Un système de fichiers compatible : Système de fichiers local pour le développement, ou S3/GCS/HDFS pour la production.
  • Maven ou Gradle : Pour la gestion des dépendances dans un projet Java/Scala.

Ajout des dépendances Iceberg

La première étape pour installer Iceberg consiste à ajouter les bibliothèques nécessaires à votre projet. Iceberg est modulaire, vous avez donc besoin de la bibliothèque principale et de la bibliothèque d'intégration spécifique au moteur (dans ce cas, Spark).

Ci-dessous se trouve l'extrait pom.xml pour Maven. Notez la version 1.2.0 ; vous devriez consulter la page officielle des versions pour la dernière version stable.

<dependency>
  <groupId>org.apache.iceberg</groupId>
  <artifactId>iceberg-core</artifactId>
  <version>1.2.0</version>
</dependency>
<dependency>
  <groupId>org.apache.iceberg</groupId>
  <artifactId>iceberg-spark-runtime-3.3_2.12</artifactId>
  <version>1.2.0</version>
</dependency>

Note importante sur le shading : L'artefact iceberg-spark-runtime est ombré (shaded), ce qui signifie qu'il réempaquète les dépendances internes pour éviter les conflits avec vos bibliothèques Spark existantes. C'est l'approche recommandée pour les applications Spark.

Configuration de la session Spark

Une fois les dépendances ajoutées, vous devez configurer la session Spark pour qu'elle reconnaisse le catalogue Iceberg. Iceberg prend en charge plusieurs catalogues, y compris hive, jdbc, rest et hadoop. Pour la simplicité et les tests locaux, nous utiliserons le HadoopCatalog qui stocke les métadonnées dans le système de fichiers lui-même.

Voici un exemple en Scala pour configurer la session Spark :

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.execution.datasources.v2.V2SessionCatalog

val spark = SparkSession.builder()
  .appName("IcebergInstallationGuide")
  .master("local[*]")
  .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
  .config("spark.sql.catalog.iceberg", "org.apache.iceberg.spark.SparkCatalog")
  .config("spark.sql.catalog.iceberg.type", "hadoop")
  .config("spark.sql.catalog.iceberg.warehouse", "/tmp/iceberg-warehouse")
  .getOrCreate()

Explication des configurations clés :

  • spark.sql.extensions : Enregistre les extensions SQL spécifiques à Iceberg.
  • spark.sql.catalog.iceberg : Définit un catalogue nommé "iceberg".
  • spark.sql.catalog.iceberg.type : Spécifie l'implémentation du catalogue. hadoop est le plus simple pour le développement local. Pour la production, utilisez hive ou rest.
  • spark.sql.catalog.iceberg.warehouse : Le répertoire racine où les données et les métadonnées des tables seront stockées.

Création et interrogation de votre première table Iceberg

Avec le catalogue configuré, vous pouvez maintenant créer une table Iceberg. Créons une table simple nommée user_events dans un espace de noms appelé analytics.

import org.apache.spark.sql.functions._

// Create namespace
spark.sql("CREATE NAMESPACE IF NOT EXISTS iceberg.analytics")

// Create table
spark.sql("""
  CREATE TABLE IF NOT EXISTS iceberg.analytics.user_events (
    id INT,
    name STRING,
    action STRING,
    timestamp TIMESTAMP
  )
  USING ICEBERG
""")

// Insert sample data
val data = spark.createDataFrame(Seq(
  (1, "Alice", "login", "2023-10-27 10:00:00".toTimestamp),
  (2, "Bob", "purchase", "2023-10-27 10:05:00".toTimestamp)
)).toDF("id", "name", "action", "timestamp")

data.writeTo("iceberg.analytics.user_events").append()

// Query the table
spark.sql("SELECT * FROM iceberg.analytics.user_events").show()

Vérification et bonnes pratiques

Après l'exécution du code ci-dessus, vous devriez voir les données d'exemple affichées dans la console. Pour vérifier que l'installation a réussi, consultez le système de fichiers à l'emplacement /tmp/iceberg-warehouse/analytics/user_events. Vous devriez voir des répertoires pour les données, les métadonnées et les instantanés (snapshots).

Bonnes pratiques pour la production :

  1. Utiliser un Metastore : Bien que le catalogue hadoop soit suffisant pour les tests, utilisez Hive Metastore ou un catalogue REST en production pour le support multi-moteurs et la gestion des métadonnées.
  2. Fréquence des commits : Les commits Iceberg peuvent être coûteux. Regroupez vos écritures pour réduire le nombre d'instantanés créés.
  3. Expiration des instantanés : Configurez des politiques d'expiration des instantanés pour gérer les coûts de stockage. Les anciens instantanés consomment de l'espace disque jusqu'à leur suppression explicite.

Conclusion

L'installation d'Apache Iceberg est un processus simple une fois que vous comprenez le système de catalogues et la gestion des dépendances. En exploitant les artefacts d'exécution ombrés et en configurant correctement la session Spark, vous pouvez rapidement commencer à construire des pipelines de données fiables et conformes ACID sur votre data lake existant. En passant en production, envisagez de migrer du catalogue Hadoop vers des catalogues Hive ou REST pour débloquer des fonctionnalités avancées comme l'accès concurrent et la gestion centralisée des métadonnées.

Share: