Usar BigLake Metastore con el catálogo REST de Iceberg

El catálogo REST de Apache Iceberg gestionado en BigLake Metastore crea interoperabilidad entre todos tus motores de consulta al ofrecer una única fuente fiable para todos tus datos de Iceberg. Permite que los motores de consultas, como Apache Spark, descubran, lean metadatos y gestionen tablas de Iceberg de forma coherente.

Las tablas de Iceberg que usas con el catálogo REST de Iceberg se denominan tablas de BigLake para Apache Iceberg (vista previa). Se trata de tablas Iceberg que se crean a partir de motores de código abierto y se almacenan en Cloud Storage. Los pueden leer buscadores 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 empezar

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

    Consulta cómo comprobar 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: consulta cómo funciona el metastore de BigLake y por qué deberías usarlo.

Roles obligatorios

Para obtener los permisos que necesitas para usar el catálogo REST de Iceberg en el metaalmacén de BigLake, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en tu proyecto o cuenta de servicio:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Limitaciones

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

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

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 es compatible con GoogleAuthManager en las siguientes versiones:

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

Haz los cambios siguientes:

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

Versiones anteriores de Iceberg

En el caso de las versiones de Iceberg anteriores a la 1.10, que no se incluyen en las imágenes de Dataproc, puedes configurar la autenticación OAuth estándar 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()

Haz los cambios siguientes:

  • CATALOG_NAME: nombre del catálogo de Iceberg REST.
  • APP_NAME: un nombre para tu sesión de Spark.
  • STORAGE_URI: el URI del bucket de Cloud Storage que contiene tus tablas Iceberg de BigLake.
  • PROJECT_ID: el proyecto al que se le factura el uso del catálogo REST de Iceberg, que puede ser diferente del proyecto propietario del segmento de Cloud Storage. Para obtener más información sobre la configuración de proyectos al usar una API REST, consulta Parámetros del sistema.
  • TOKEN: tu token de autenticación, que tiene una validez de una hora. Por ejemplo, un token generado con gcloud auth application-default print-access-token.

Crear un espacio de nombres

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

spark.sql("USE NAMESPACE_NAME;")

Sustituye NAMESPACE_NAME por el nombre del espacio de nombres.

Crear una tabla

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

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

Haz los cambios siguientes:

  • NAMESPACE_NAME: el nombre de tu espacio de nombres
  • TABLE_NAME: un nombre para la tabla

Mostrar lista de tablas

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

Insertar 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 de BigQuery:

SELECT * FROM `CLOUD_STORAGE_BUCKET_NAME>NAMESPACE_NAME.TABLE_NAME`;

Sustituye CLOUD_STORAGE_BUCKET_NAME por el nombre del segmento de Cloud Storage de tu catálogo REST de Iceberg. Por ejemplo, si su URI es gs://iceberg_bucket, utilice iceberg_bucket.

Modificar un esquema de tabla

En el siguiente ejemplo se añade una columna a la tabla:

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

Eliminar una tabla

En el siguiente ejemplo se elimina la tabla del espacio de nombres indicado:

spark.sql("DROP TABLE TABLE_NAME;")

Precios

Para obtener información sobre los precios, consulta los precios de BigLake.

Siguientes pasos