Administra metadatos de código abierto con BigLake Metastore

BigLake Metastore es un servicio de metadatos físicos unificado para productos de análisis de datos en Google Cloud. BigLake Metastore proporciona una sola fuente de información para los metadatos y te permite administrar y acceder a los datos de varias fuentes. Se puede acceder a BigLake Metastore desde BigQuery y varios motores de procesamiento de datos abiertos en Dataproc, por lo que es una herramienta útil para los ingenieros y analistas de datos.

Para la administración de metadatos empresariales, consulta Dataplex.

Cómo funciona BigLake Metastore

BigLake Metastore es un servicio sin servidores que no requiere que aprovisiones recursos antes de usarlo. Puedes usarlo como alternativa sinservidores a Hive Metastore en clústeres de Dataproc. BigLake Metastore funciona de la misma manera que Hive Metastore a través de las APIs compatibles con Hive y puedes consultar de inmediato tablas de formato abierto en BigQuery sin más pasos. BigLake Metastore solo admite tablas de Apache Iceberg.

BigLake Metastore proporciona APIs, bibliotecas cliente y, también, integración de motores de datos (como Apache Spark) para administrar catálogos, bases de datos y tablas.

Limitaciones

BigLake Metastore está sujeto a las siguientes limitaciones:

  • BigLake Metastore no es compatible con las tablas de Apache Hive.
  • Los roles y los permisos de Identity and Access Management (IAM) solo se pueden otorgar a los proyectos. No se admite otorgar permisos de IAM a los recursos.
  • Cloud Monitoring no es compatible.
  • Los catálogos y bases de datos de BigLake Metastore tienen las siguientes limitaciones de nombres:
    • Los nombres pueden tener hasta 1,024 caracteres.
    • Los nombres solo pueden contener letras UTF-8 (mayúsculas, minúsculas), números y guiones bajos.
    • Los nombres deben ser únicos para cada combinación de proyecto y región.
  • Las tablas de BigLake Metastore siguen las mismas convenciones de nombres que las tablas de BigQuery. Para obtener más información, consulta Nombres de las tablas.

Antes de comenzar

Debes habilitar la facturación y la API de BigLake antes de usar BigLake Metastore.

  1. Solicita al administrador que te otorgue el rol de IAM de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin) en tu proyecto. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso.
  2. Habilita la facturación para tu proyecto de Google Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.
  3. Habilita la API de BigLake.

    Habilitar la API

Roles obligatorios

  • Para tener control total sobre los recursos de BigLake Metastore, necesitas el rol de administrador de BigLake (roles/biglake.admin). Si usas una cuenta de servicio del conector de BigQuery Spark, una cuenta de servicio de Dataproc Serverless o una cuenta de servicio de VM de Dataproc, otorga el rol de administrador de BigLake a la cuenta.
  • Para tener acceso de solo lectura a los recursos de BigLake Metastore, necesitas el rol de visualizador de BigLake (roles/biglake.viewer). Por ejemplo, cuando consultas una tabla de BigLake Metastore en BigQuery, el usuario o la cuenta de servicio de conexión de BigQuery debe tener el rol visualizador de BigLake.
  • Para crear tablas de BigQuery con conexiones, necesitas el rol de Usuario de conexión de BigQuery (roles/bigquery.connectionUser). Para obtener más información sobre el uso compartido de las conexiones, consulta Comparte conexiones con usuarios.

Según el caso de uso, la identidad que llama a BigLake Metastore puede ser usuarios o cuentas de servicio:

  • Usuario: cuando llamas directamente a la API de REST de BigLake o cuando consultas una tabla de Iceberg de BigQuery sin una conexión desde BigQuery. En este caso, BigQuery usa las credenciales del usuario.
  • Conexión de recursos de Cloud de BigQuery: cuando se consulta una tabla de Iceberg de BigQuery con una conexión de BigQuery. BigQuery usa la credencial de la cuenta de servicio de conexión para acceder a BigLake Metastore.
  • Conector de Spark de BigQuery: cuando usas Spark con BigLake Metastore en un procedimiento almacenado de Spark de BigQuery. Spark usa la credencial de la cuenta de servicio del conector de Spark para acceder a BigLake Metastore y crear tablas de BigQuery.
  • Cuenta de servicio sin servidores de Dataproc: cuando se usa Spark con BigLake en Dataproc Serverless. Spark usa la credencial de la cuenta de servicio.
  • Cuenta de servicio de VM de Dataproc: cuando se usa Dataproc (no Dataproc Serverless). Apache Spark usa la credencial de la cuenta de servicio de VM.

Según los permisos que tengas, puedes otorgarte estos roles o pedirle a tu administrador que te los otorgue. Para obtener más información sobre cómo otorgar roles, consulta Visualiza los roles que se pueden otorgar en los recursos.

Para ver los permisos exactos necesarios para acceder a los recursos de BigLake Metastore, expande la sección Permisos necesarios:

Permisos necesarios

  • biglake.tables.get a nivel de proyecto, para todos los accesos de solo lectura. La consulta de una tabla de Iceberg de BigQuery es de solo lectura.
  • biglake.{catalogs|databases|tables}.* a nivel de proyecto, para todos los permisos de lectura y escritura. Por lo general, Apache Spark necesita la capacidad de leer y escribir datos, lo que incluye la capacidad de crear, administrar y ver catálogos, bases de datos y tablas.
  • bigquery.connections.delegate a nivel de conexión de recursos de Cloud de BigQuery o superior, para crear una tabla de Iceberg de BigQuery con una conexión.

Conéctate a BigLake Metastore

En las siguientes secciones, se explica cómo conectarse a BigLake Metastore. En estas secciones, se instalan y usan el complemento del catálogo de Apache Iceberg de BigLake, que se indica a través de los archivos JAR en los siguientes métodos. El complemento del catálogo se conecta a BigLake Metastore desde motores de código abierto como Apache Spark.

Conéctate con una VM de Dataproc

Para conectarte a BigLake Metastore con una VM de Dataproc, haz lo siguiente:

  1. Usa SSH para conectarte a Dataproc.
  2. En la CLI de Spark SQL, usa la siguiente instrucción para instalar y configurar el catálogo personalizado de Apache Iceberg para que funcione con BigLake Metastore:

    spark-sql \
      --packages ICEBERG_SPARK_PACKAGE \
      --jars BIGLAKE_ICEBERG_CATALOG_JAR \
      --conf spark.sql.catalog.SPARK_CATALOG=org.apache.iceberg.spark.SparkCatalog \
      --conf spark.sql.catalog.SPARK_CATALOG.catalog-impl=org.apache.iceberg.gcp.biglake.BigLakeCatalog \
      --conf spark.sql.catalog.SPARK_CATALOG.gcp_project=PROJECT_ID \
      --conf spark.sql.catalog.SPARK_CATALOG.gcp_location=LOCATION \
      --conf spark.sql.catalog.SPARK_CATALOG.blms_catalog=BLMS_CATALOG \
      --conf spark.sql.catalog.SPARK_CATALOG.warehouse=GCS_DATA_WAREHOUSE_FOLDER \
      --conf spark.sql.catalog.SPARK_HMS_CATALOG=org.apache.iceberg.spark.SparkCatalog \
      --conf spark.sql.catalog.SPARK_HMS_CATALOG.type=hive \
      --conf spark.sql.catalog.SPARK_HMS_CATALOG.uri=thrift://HMS_URI:9083
      

Reemplaza lo siguiente:

  • ICEBERG_SPARK_PACKAGE: Es la versión de Apache Iceberg con Spark que se usará. Recomendamos usar la versión de Spark que coincida con la versión de Spark en tu instancia de Dataproc o Dataproc sin servidores. . Para ver una lista de las versiones disponibles de Apache Iceberg, consulta Descargas de Apache Iceberg. Por ejemplo, la marca para Apache Spark 3.3 es la siguiente:
    --packages org.apache.iceberg:iceberg-spark-runtime-3.3_2.13-1.2.1
  • BIGLAKE_ICEBERG_CATALOG_JAR: Es el URI de Cloud Storage del complemento del catálogo personalizado de Iceberg que se instalará. Según tu entorno, selecciona una de las siguientes opciones:
    • Iceberg 1.2.0: gs://spark-lib/biglake/biglake-catalog-iceberg1.2.0-0.1.1-with-dependencies.jar
    • Iceberg 0.14.0: gs://spark-lib/biglake/biglake-catalog-iceberg0.14.0-0.1.1-with-dependencies.jar
  • SPARK_CATALOG: Es el identificador de catálogo para Spark. Está vinculado a un catálogo de BigLake Metastore.
  • PROJECT_ID: Es el ID del proyecto de Google Cloud del catálogo de BigLake Metastore con el que se vincula el catálogo de Spark.
  • LOCATION: Es la ubicación de Google Cloud del catálogo de BigLake Metastore con el que se vincula el catálogo de Spark.
  • BLMS_CATALOG: Es el ID del catálogo de BigLake Metastore con el que se vincula el catálogo de Spark. No es necesario que el catálogo exista, y este se puede crear en Spark.
  • GCS_DATA_WAREHOUSE_FOLDER: Es la carpeta de Cloud Storage en la que Spark crea todos los archivos. Comienza con gs://.
  • HMS_DB: Es la base de datos de HMS que contiene la tabla desde la que se debe copiar (opcional).
  • HMS_TABLE: Es la tabla de HMS desde la que se debe copiar (opcional).
  • HMS_URI: Es el extremo de Thrift de HMS (opcional).

Conéctate con un clúster de Dataproc

Como alternativa, puedes enviar un trabajo de Dataproc a un clúster. En el siguiente ejemplo, se instala el catálogo personalizado de Iceberg adecuado.

Para conectarte con un clúster de Dataproc, envía un trabajo con las siguientes especificaciones:

CONFS="spark.sql.catalog.SPARK_CATALOG=org.apache.iceberg.spark.SparkCatalog,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.catalog-impl=org.apache.iceberg.gcp.biglake.BigLakeCatalog,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.gcp_project=PROJECT_ID,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.gcp_location=LOCATION,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.blms_catalog=BLMS_CATALOG,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.warehouse=GCS_DATA_WAREHOUSE_FOLDER,"
CONFS+="spark.jars.packages=ICEBERG_SPARK_PACKAGE"

gcloud dataproc jobs submit spark-sql --cluster=DATAPROC_CLUSTER \
  --project=DATAPROC_PROJECT_ID \
  --region=DATAPROC_LOCATION \
  --jars=BIGLAKE_ICEBERG_CATALOG_JAR \
  --properties="${CONFS}" \
  --file=QUERY_FILE_PATH

Reemplaza lo siguiente:

  • DATAPROC_CLUSTER: Es el clúster de Dataproc al que se envía el trabajo.
  • DATAPROC_PROJECT_ID: es el ID del proyecto del clúster de Dataproc. Este ID puede ser diferente de PROJECT_ID.
  • DATAPROC_LOCATION es la ubicación del clúster de Dataproc. Esta ubicación puede ser diferente de LOCATION.
  • QUERY_FILE_PATH: Es la ruta al archivo que contiene las consultas que se ejecutarán.

Conéctate con Dataproc Serverless

Del mismo modo, puedes enviar una carga de trabajo por lotes a Dataproc Serverless. Para hacerlo, sigue las instrucciones de la carga de trabajo por lotes con las siguientes marcas adicionales:

  • --properties="${CONFS}"
  • --jars=BIGLAKE_ICEBERG_CATALOG_JAR

Conéctate con procedimientos almacenados en BigQuery

Puedes usar procedimientos almacenados de BigQuery para ejecutar trabajos Dataproc Serverless. El proceso es similar a la ejecución de trabajos de Dataproc Serverless directamente en Dataproc.

Crea recursos de almacén de metadatos

En las siguientes secciones, se describe cómo crear recursos en el almacén de metadatos.

Crea catálogos

Los nombres de catálogos tienen restricciones. Para obtener más información, consulta Limitaciones. Para crear un catálogo, selecciona una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.create y especifica el nombre de un catálogo.

Spark SQL

CREATE NAMESPACE SPARK_CATALOG;

Terraform

Esto crea una base de datos de BigLake llamada “my_database” del tipo “HIVE” en el catálogo que especifica la variable “google_biglake_catalog.default.id”. Para obtener más información, consulta la documentación de Terraform BigLake.

resource "google_biglake_catalog" "default" {
name     = "my_catalog"
location = "US"
}

Crea bases de datos

Los nombres de las bases de datos tienen restricciones. Para obtener más información, consulta Limitaciones. Para garantizar que tu recurso de base de datos sea compatible con los motores de datos, te recomendamos que crees bases de datos con motores de datos, en lugar de crear el cuerpo de recursos de forma manual. Para crear una base de datos, selecciona una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.databases.create y especifica el nombre de una base de datos.

Spark SQL

CREATE NAMESPACE BLMS_DB;

Reemplaza lo siguiente:

  • BLMS_DB: el ID de la tabla de BigLake Metastore para crear

Terraform

Esto crea una base de datos de BigLake llamada “my_database” del tipo “HIVE” en el catálogo que especifica la variable “google_biglake_catalog.default.id”. Para obtener más información, consulta la documentación de Terraform BigLake.

resource "google_biglake_database" "default" {
name    = "my_database"
catalog = google_biglake_catalog.default.id
type    = "HIVE"
hive_options {
  location_uri = "gs://${google_storage_bucket.default.name}/${google_storage_bucket_object.metadata_directory.name}"
  parameters = {
    "owner" = "Alex"
  }
}
}

Crear tablas

Los nombres de tablas tienen restricciones. Para obtener más información, consulta Nombres de las tablas. Para crear una tabla, elige una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.databases.tables.create y especifica el nombre de una tabla.

Spark SQL

CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE
  (id bigint, data string) USING iceberg;

Reemplaza lo siguiente:

  • BLMS_TABLE: el ID de la tabla de BigLake Metastore para crear

Terraform

Esto crea una tabla de BigLake Metastore con el nombre "my_table" y el tipo "HIVE" en la base de datos especificada por la variable "google_biglake_database.default.id". Consulta la documentación del proveedor de Terraform para obtener más información: Tabla de BigLake.

resource "google_biglake_table" "default" {
name     = "my-table"
database = google_biglake_database.default.id
type     = "HIVE"
hive_options {
  table_type = "MANAGED_TABLE"
  storage_descriptor {
    location_uri  = "gs://${google_storage_bucket.default.name}/${google_storage_bucket_object.data_directory.name}"
    input_format  = "org.apache.hadoop.mapred.SequenceFileInputFormat"
    output_format = "org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat"
  }
  parameters = {
    "spark.sql.create.version"          = "3.1.3"
    "spark.sql.sources.schema.numParts" = "1"
    "transient_lastDdlTime"             = "1680894197"
    "spark.sql.partitionProvider"       = "catalog"
    "owner"                             = "Alex"
    "spark.sql.sources.schema.part.0" = jsonencode({
      "type" : "struct",
      "fields" : [
        { "name" : "id", "type" : "integer",
          "nullable" : true,
          "metadata" : {}
        },
        {
          "name" : "name",
          "type" : "string",
          "nullable" : true,
          "metadata" : {}
        },
        {
          "name" : "age",
          "type" : "integer",
          "nullable" : true,
          "metadata" : {}
        }
      ]
    })
    "spark.sql.sources.provider" = "iceberg"
    "provider"                   = "iceberg"
  }
}
}

Ejemplo de Terraform E2E

En este ejemplo de GitHub, se proporciona un ejemplo de E2E ejecutable que crea un catálogo, una base de datos y una tabla de Metastore “BigLake”. Para obtener más información sobre cómo usar este ejemplo, consulta Comandos básicos de Terraform.

Copia una tabla de Iceberg de Hive Metastore en BigLake Metastore

Para crear una tabla de Iceberg y copiar una tabla de Hive Metastore en BigLake Metastore, usa la siguiente instrucción de Spark SQL:

CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE
  (id bigint, data string) USING iceberg
  TBLPROPERTIES(hms_table='HMS_DB.HMS_TABLE');

BigLake Metastore es el almacén de metadatos recomendado para consultartablas de BigLake Iceberg. Cuando creas una tabla de Iceberg en Spark, puedes crear de forma opcional una tabla de BigLake Iceberg vinculada al mismo tiempo.

Para crear una tabla de Iceberg en Spark y crear automáticamente una tabla de BigLake Iceberg al mismo tiempo, usa la siguiente instrucción de Spark SQL:

  CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE
    (id bigint, data string) USING iceberg
    TBLPROPERTIES(bq_table='BQ_TABLE_PATH',
    bq_connection='BQ_RESOURCE_CONNECTION');

Reemplaza lo siguiente:

  • BQ_TABLE_PATH: la ruta de la tabla de BigLake Iceberg que se creará. Sigue la sintaxis de ruta de la tabla de BigQuery. Usa el mismo proyecto que el catálogo de BigLake Metastore si el proyecto no se especifica.
  • BQ_RESOURCE_CONNECTION (opcional): El formato es project.location.connection-id. Si se especifica, las consultas de BigQuery usan las credenciales de la conexión de recursos de Cloud para acceder a BigLake Metastore. Si no se especifica, BigQuery crea una tabla externa normal en lugar de una tabla de BigLake.

Para crear manualmente vínculos de tablas de BigLake Iceberg con URI de tablas de BigLake Metastore especificados (blms://…), usa la siguiente instrucción de BigQuery SQL:

CREATE EXTERNAL TABLE 'BQ_TABLE_PATH'
  WITH CONNECTION `BQ_RESOURCE_CONNECTION`
  OPTIONS (
          format = 'ICEBERG',
          uris = ['blms://projects/PROJECT_ID/locations/LOCATION/catalogs/BLMS_CATALOG/databases/BLMS_DB/tables/BLMS_TABLE']
          )

Visualiza recursos del almacén de metadatos

En las siguientes secciones, se describe cómo ver los recursos en BigLake Metastore.

Ve catálogos

Para ver todas las bases de datos en un catálogo, usa el método projects.locations.catalogs.list y especifica el nombre de un catálogo.

Para ver información sobre un catálogo, usa el método projects.locations.catalogs.get y especifica el nombre de un catálogo.

Ve bases de datos

Para ver una base de datos, sigue estos pasos:

API

Para ver todas las tablas en una base de datos, usa el método projects.locations.catalogs.databases.list y especifica el nombre de una base de datos.

Para ver información sobre una base de datos, usa el método projects.locations.catalogs.databases.get y especifica el nombre de una base de datos.

Spark SQL

Para ver todas las bases de datos en un catálogo, usa la siguiente instrucción:

SHOW { DATABASES | NAMESPACES } IN SPARK_CATALOG;

Para ver información sobre una base de datos definida, usa la siguiente instrucción:

DESCRIBE { DATABASE | NAMESPACE } [EXTENDED] SPARK_CATALOG.BLMS_DB;

Ver tablas

Para ver todas las tablas en una base de datos o una tabla definida, haz lo siguiente:

API

Para ver todas las tablas en una base de datos, usa el método projects.locations.catalogs.databases.tables.list y especifica el nombre de una base de datos.

Para ver información sobre una tabla, usa el método projects.locations.catalogs.databases.tables.get y especifica el nombre de una tabla.

Spark SQL

Para ver todas las tablas en una base de datos, usa la siguiente instrucción:

SHOW TABLES IN SPARK_CATALOG.BLMS_DB;

Para ver información sobre una tabla definida, usa la siguiente instrucción:

DESCRIBE TABLE [EXTENDED] SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

Modifica los recursos del almacén de metadatos

En las siguientes secciones, se describe cómo modificar los recursos en el almacén de metadatos.

Actualiza tablas

Para evitar conflictos cuando varios trabajos intentan actualizar la misma tabla al mismo tiempo, BigLake Metastore usa el bloqueo optimista. Para usar el bloqueo optimista, primero debes obtener la versión actual de la tabla (llamada ETag) a través del método GetTable. Luego, puedes realizar cambios en la tabla y usar el método UpdateTable si pasas la ETag que se recuperó. Si otro trabajo actualiza la tabla después de recuperar la ETag, el método UpdateTable fallará. Esta medida garantiza que solo un trabajo pueda actualizar la tabla a la vez, lo que evita conflictos.

Para actualizar una tabla, elige una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.databases.tables.patch y especifica el nombre de una tabla.

Spark SQL

Para ver las opciones de actualización de la tabla en SQL, consulta ALTER TABLE.

Cambia el nombre de las tablas

Para cambiar el nombre de una tabla, selecciona una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.databases.tables.rename y especifica el nombre de una tabla y un valor newName.

Spark SQL

ALTER TABLE BLMS_TABLE RENAME TO NEW_BLMS_TABLE;

Reemplaza lo siguiente:

  • NEW_BLMS_TABLE: Es el nombre nuevo de BLMS_TABLE. Debe estar en el mismo conjunto de datos que BLMS_TABLE.

Borra los recursos del almacén de metadatos

En las siguientes secciones, se describe cómo borrar recursos en BigLake Metastore.

Borra catálogos

Para borrar un catálogo, selecciona una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.delete y especifica el nombre de un catálogo. Con este método, no se borran los archivos asociados en Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG;

Borra bases de datos

Para borrar una base de datos, selecciona una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.databases.delete y especifica el nombre de una base de datos. Con este método, no se borran los archivos asociados en Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG.BLMS_DB;

Borra las tablas

Para borrar una tabla, selecciona una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.databases.tables.delete y especifica el nombre de una tabla. Con este método, no se borran los archivos asociados en Google Cloud.

Spark SQL

Para descartar la tabla, usa la siguiente instrucción:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

Para descartar la tabla y borrar los archivos asociados en Google Cloud, usa la siguiente instrucción:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE PURGE;