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. Verify 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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    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 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

Iceberg 1.10 ou version ultérieure

Iceberg 1.10 et les versions ultérieures sont compatibles avec les flux d'autorisation Google dans GoogleAuthManager. Dataproc Spark est également compatible avec GoogleAuthManager dans les versions suivantes :

  • Versions d'exécution Dataproc sur Compute Engine 2.2.65 et ultérieures
  • Images Dataproc sans serveur pour Spark 2.2.60 et versions ultérieures
  • Versions d'exécution Dataproc sur Compute Engine 2.3.11 et ultérieures
  • Images Dataproc sans serveur pour Spark 2.3.10 et versions ultérieures
import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_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}.header.x-goog-user-project', 'PROJECT_ID') \
  .config(f'spark.sql.catalog.{catalog_name}.rest.auth.type', 'org.apache.iceberg.gcp.auth.GoogleAuthManager') \
  .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') \
  .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
  .getOrCreate()

Remplacez les éléments suivants :

  • CATALOG_NAME : nom de votre catalogue REST Iceberg.
  • APP_NAME : nom de votre session Spark.
  • STORAGE_URI : URI du bucket Cloud Storage contenant vos tables BigLake Iceberg.
  • 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.

Versions précédentes d'Iceberg

Pour les versions d'Iceberg antérieures à 1.10 qui ne sont pas incluses dans les images Dataproc, vous pouvez configurer l'authentification OAuth standard en configurant une session avec les éléments suivants :

import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_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}.header.x-goog-user-project', 'PROJECT_ID') \
  .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}.io-impl', 'org.apache.iceberg.hadoop.HadoopFileIO') \
  .config(f'spark.sql.catalog.{catalog_name}.rest-metrics-reporting-enabled', 'false') \
  .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
  .getOrCreate()

Remplacez les éléments suivants :

  • CATALOG_NAME : nom de votre catalogue REST Iceberg.
  • APP_NAME : nom de votre session Spark.
  • STORAGE_URI : URI du bucket Cloud Storage contenant vos tables BigLake Iceberg.
  • 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.
  • TOKEN : votre jeton d'authentification, qui est valide pendant une heure (par exemple, un jeton généré à l'aide de gcloud auth application-default print-access-token).

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()

L'exemple suivant interroge la même table depuis BigQuery :

SELECT * FROM `CLOUD_STORAGE_BUCKET_NAME>NAMESPACE_NAME.TABLE_NAME`;

Remplacez CLOUD_STORAGE_BUCKET_NAME par le nom du bucket Cloud Storage pour votre catalogue Iceberg REST. Par exemple, si votre URI est gs://iceberg_bucket, utilisez iceberg_bucket.

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