Utiliser BigLake Metastore avec le catalogue Iceberg REST

Le catalogue REST Apache Iceberg géré dans le métastore BigLake assure l'interopérabilité entre tous vos moteurs de requête en offrant une source unique de vérité pour toutes vos données Iceberg. Il permet aux moteurs de requête, tels qu'Apache Spark, de découvrir, de lire les métadonnées et de gérer les tables Iceberg de manière cohérente.

Les tables Iceberg que vous utilisez avec le catalogue Iceberg REST sont appelées tables BigLake pour Apache Iceberg (preview). Il s'agit de tables Iceberg que vous créez à partir de moteurs Open Source et que vous stockez dans Cloud Storage. Ils peuvent être lus par des moteurs Open Source ou BigQuery. Les écritures ne sont acceptées que depuis les moteurs Open Source. Dans ce document, nous appelons ces tables "tables BigLake Iceberg".

Avant de commencer

  1. Make sure that billing is enabled for your Google Cloud project.

    Découvrez comment vérifier si la facturation est activée sur un projet.
  2. Enable the BigLake API.

    Enable the API

  3. Facultatif : Découvrez le fonctionnement de BigLake Metastore et pourquoi vous devriez l'utiliser.

Rôles requis

Pour obtenir les autorisations nécessaires pour utiliser le catalogue REST Iceberg dans le metastore BigLake, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet ou votre compte de service :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Limites

Le catalogue REST Iceberg est soumis aux limites suivantes :

Configurer un moteur de requête avec le catalogue REST Iceberg

import google.auth
from google.auth.transport.requests import Request
from google.oauth2 import service_account
import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_NAME") \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.type", "rest") \
    .config(f"spark.sql.catalog.{catalog_name}.uri","https://biglake.googleapis.com/iceberg/v1beta/restcatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.warehouse", "gs://STORAGE_URI") \
    .config(f"spark.sql.catalog.{catalog_name}.token", "TOKEN") \
    .config(f"spark.sql.catalog.{catalog_name}.oauth2-server-uri", "https://oauth2.googleapis.com/token") \
    .config(f"spark.sql.catalog.{catalog_name}.header.x-goog-user-project", "PROJECT_ID") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl","org.apache.iceberg.hadoop.HadoopFileIO") \
    .config(f"spark.sql.catalog.{catalog_name}.rest-metrics-reporting-enabled", "false") \
    .getOrCreate()

Remplacez les éléments suivants :

  • CATALOG_NAME : nom de votre catalogue Iceberg REST.
  • APP_NAME : nom de votre session Spark.
  • STORAGE_URI : URI du bucket Cloud Storage contenant vos tables BigLake Iceberg.
  • TOKEN : votre jeton d'authentification, qui est valide pendant une heure (par exemple, gcloud auth application-default print-access-token).
  • PROJECT_ID : projet facturé pour l'utilisation du catalogue REST Iceberg, qui peut être différent du projet propriétaire du bucket Cloud Storage. Pour en savoir plus sur la configuration du projet lorsque vous utilisez une API REST, consultez Paramètres système.

Créer un espace de noms

spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME;")

spark.sql("USE NAMESPACE_NAME;")

Remplacez NAMESPACE_NAME par le nom de votre espace de noms.

Créer une table

spark.sql("CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG;")

spark.sql("DESCRIBE NAMESPACE_NAME.TABLE_NAME").show()

Remplacez les éléments suivants :

  • NAMESPACE_NAME : nom de votre espace de noms
  • TABLE_NAME : nom de votre table

Répertorier des tables

spark.sql("SHOW TABLES").show()

Insérer des données dans la table

L'exemple suivant insère des exemples de données dans la table :

spark.sql("INSERT INTO TABLE_NAME VALUES (1, \"first row\"), (2, \"second row\"), (3, \"third row\");")

Exécuter des requêtes sur une table

L'exemple suivant sélectionne toutes les données de la table :

spark.sql("SELECT * FROM TABLE_NAME;").show()

Modifier le schéma d'une table

L'exemple suivant ajoute une colonne à la table :

spark.sql("ALTER TABLE TABLE_NAME ADD COLUMNS ( desc string);")
spark.sql("DESCRIBE NAMESPACE_NAME.TABLE_NAME").show()

Supprimer une table

L'exemple suivant supprime la table de l'espace de noms indiqué :

spark.sql("DROP TABLE TABLE_NAME;")

Tarifs

Pour en savoir plus sur les tarifs, consultez la page Tarifs de BigLake.

Étapes suivantes