Usa BigLake Metastore con el catálogo de REST de Iceberg

El catálogo REST de Apache Iceberg administrado en BigLake Metastore crea interoperabilidad entre todos tus motores de consultas, ya que ofrece una sola fuente de verdad para todos tus datos de Iceberg. Permite que los motores de consultas, como Apache Spark, descubran, lean metadatos y administren tablas de Iceberg de manera coherente.

Las tablas de Iceberg que usas con el catálogo de REST de Iceberg se denominan tablas de BigLake para Apache Iceberg (versión preliminar). Son tablas de Iceberg que creas a partir de motores de código abierto y que almacenas en Cloud Storage. Los pueden leer los motores de código abierto o BigQuery. Las escrituras solo se admiten desde motores de código abierto. En este documento, nos referimos a estas tablas como tablas de BigLake Iceberg.

Antes de comenzar

  1. Verify that billing is enabled for your Google Cloud project.

    Obtén información para verificar si la facturación está habilitada en un proyecto.
  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. Opcional: Comprende cómo funciona BigLake Metastore y por qué deberías usarlo.

Roles requeridos

Para obtener los permisos que necesitas para usar el catálogo de REST de Iceberg en el metastore de BigLake, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto o cuenta de servicio:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

Limitaciones

El catálogo de REST de Iceberg está sujeto a las siguientes limitaciones:

Configura un motor de consultas con el catálogo de Iceberg REST

Iceberg 1.10 o versiones posteriores

Iceberg 1.10 y las versiones posteriores tienen compatibilidad integrada con los flujos de autorización de Google en GoogleAuthManager. Dataproc Spark también admite GoogleAuthManager en las siguientes versiones:

  • Versiones de tiempo de ejecución 2.2 de Dataproc en Compute Engine: 2.2.65 y versiones posteriores
  • Imágenes 2.2.60 y versiones posteriores de Dataproc Serverless para Spark 2.2
  • Versiones del entorno de ejecución 2.3 de Dataproc en Compute Engine: 2.3.11 y versiones posteriores
  • Imágenes 2.3.10 y posteriores de Dataproc Serverless para Spark 2.3
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()

Reemplaza lo siguiente:

  • CATALOG_NAME: Es el nombre de tu catálogo de Iceberg REST.
  • APP_NAME: Es un nombre para tu sesión de Spark.
  • STORAGE_URI: Es el URI del bucket de Cloud Storage que contiene tus tablas de BigLake Iceberg.
  • PROJECT_ID: Es el proyecto al que se le factura el uso del catálogo de REST de Iceberg, que puede ser diferente del proyecto propietario del bucket de Cloud Storage. Para obtener detalles sobre la configuración del proyecto cuando se usa una API de REST, consulta Parámetros del sistema.

Versiones anteriores de Iceberg

Para las versiones de Iceberg anteriores a la 1.10 que no se incluyen en las imágenes de Dataproc, puedes configurar la autenticación estándar de OAuth configurando una sesión con lo siguiente:

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

Reemplaza lo siguiente:

  • CATALOG_NAME: Es el nombre de tu catálogo de Iceberg REST.
  • APP_NAME: Es un nombre para tu sesión de Spark.
  • STORAGE_URI: Es el URI del bucket de Cloud Storage que contiene tus tablas de BigLake Iceberg.
  • PROJECT_ID: Es el proyecto al que se le factura el uso del catálogo de REST de Iceberg, que puede ser diferente del proyecto propietario del bucket de Cloud Storage. Para obtener detalles sobre la configuración del proyecto cuando se usa una API de REST, consulta Parámetros del sistema.
  • TOKEN: Tu token de autenticación, que es válido por una hora, por ejemplo, un token generado con gcloud auth application-default print-access-token.

Crea un espacio de nombres

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

spark.sql("USE NAMESPACE_NAME;")

Reemplaza NAMESPACE_NAME por un nombre para el espacio de nombres.

Crea una tabla

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

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

Reemplaza lo siguiente:

  • NAMESPACE_NAME: Es el nombre de tu espacio de nombres.
  • TABLE_NAME: Un nombre para tu tabla

Enumerar tablas

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

Inserta datos en la tabla

En el siguiente ejemplo, se insertan datos de muestra en la tabla:

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

Consultar una tabla

En el siguiente ejemplo, se seleccionan todos los datos de la tabla:

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

En el siguiente ejemplo, se consulta la misma tabla desde BigQuery:

SELECT * FROM `CLOUD_STORAGE_BUCKET_NAME>NAMESPACE_NAME.TABLE_NAME`;

Reemplaza CLOUD_STORAGE_BUCKET_NAME por el nombre del bucket de Cloud Storage para tu catálogo de Iceberg REST. Por ejemplo, si tu URI es gs://iceberg_bucket, usa iceberg_bucket.

Cómo modificar un esquema de tabla

En el siguiente ejemplo, se agrega una columna a la tabla:

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

Borra una tabla

En el siguiente ejemplo, se borra la tabla del espacio de nombres determinado:

spark.sql("DROP TABLE TABLE_NAME;")

Precios

Para obtener detalles sobre los precios, consulta Precios de BigLake.

¿Qué sigue?