Gestionar metadatos de código abierto con el almacén de metadatos de BigLake (clásico)

BigLake Metastore (clásico) es un servicio de metadatos físicos unificado para productos de analíticas de datos en Google Cloud. BigLake Metastore (clásico) proporciona una única fuente de información veraz para los metadatos y te permite gestionar y acceder a datos de varias fuentes. Se puede acceder al metastore de BigLake (clásico) desde BigQuery y varios motores de procesamiento de datos abiertos en Dataproc, lo que lo convierte en una herramienta útil para analistas e ingenieros de datos.

Para gestionar los metadatos empresariales, consulta Dataplex Universal Catalog.

Cómo funciona el metastore de BigLake (clásico)

BigLake Metastore (clásico) es un servicio sin servidor que no requiere que aprovisiones recursos antes de usarlo. Puedes usarlo como alternativa sin servidor a Hive Metastore en clústeres de Dataproc. El metastore de BigLake (clásico) funciona igual que Hive Metastore a través de sus APIs compatibles con Hive, y puedes consultar inmediatamente las tablas de formato abierto en BigQuery sin tener que hacer nada más. BigLake Metastore (clásico) solo admite tablas de Apache Iceberg.

BigLake Metastore (clásico) proporciona APIs, bibliotecas de cliente e integración de motores de datos (como Apache Spark) para gestionar catálogos, bases de datos y tablas.

Limitaciones

BigLake Metastore (clásico) está sujeto a las siguientes limitaciones:

  • BigLake Metastore (clásico) no admite tablas de Apache Hive.
  • Los roles y permisos de Gestión de Identidades y Accesos (IAM) solo se pueden conceder a proyectos. No se admite la concesión de permisos de gestión de identidades y acceso a los recursos.
  • No se admite Cloud Monitoring.
  • Los catálogos y las bases de datos de metastore de BigLake (clásico) tienen las siguientes limitaciones de nomenclatura:
    • Los nombres pueden tener hasta 1024 caracteres.
    • Los nombres solo pueden contener letras UTF-8 (mayúsculas y minúsculas), números y guiones bajos.
    • Los nombres deben ser únicos para cada combinación de proyecto y región.
  • Las tablas de metastore de BigLake (clásico) siguen las mismas convenciones de nomenclatura que las tablas de BigQuery. Para obtener más información, consulta el artículo Nombres de tablas.

Antes de empezar

Para usar el metastore de BigLake (clásico), debes habilitar la facturación y la API BigLake.

  1. Pídele a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de Uso de Servicio (roles/serviceusage.serviceUsageAdmin) en tu proyecto. Para obtener más información sobre cómo conceder roles, consulta el artículo sobre cómo gestionar el acceso.
  2. Habilita la facturación de tu Google Cloud proyecto. Consulta cómo comprobar si la facturación está habilitada en un proyecto.
  3. Habilita la API BigLake.

    Activar la API

Roles obligatorios

  • Para tener control total sobre los recursos del metastore de BigLake (clásico), necesitas el rol Administrador de BigLake (roles/biglake.admin). Si usas una cuenta de servicio del conector Spark de BigQuery, una cuenta de servicio de Serverless para Apache Spark o una cuenta de servicio de VM de Dataproc, asigna el rol Administrador de BigLake a la cuenta.
  • Para tener acceso de solo lectura a los recursos del metastore de BigLake (clásico), necesitas el rol Lector de BigLake (roles/biglake.viewer). Por ejemplo, al consultar una tabla del metastore de BigLake (clásico) en BigQuery, el usuario o la cuenta de servicio de conexión de BigQuery deben tener el rol Lector de BigLake.
  • Para crear tablas de BigQuery con conexiones, necesitas el rol Usuario de conexión de BigQuery (roles/bigquery.connectionUser). Para obtener más información sobre cómo compartir conexiones, consulta Compartir conexiones con usuarios.

En función del caso práctico, la identidad que llama a BigLake Metastore (clásico) puede ser un usuario o una cuenta de servicio:

  • Usuario: al llamar directamente a la API de BigLake o al consultar una tabla de BigLake para Apache Iceberg en una tabla de BigQuery sin una conexión de BigQuery. En este caso, BigQuery usa las credenciales del usuario.
  • Conexión de recursos de Cloud de BigQuery: cuando se consulta una tabla Iceberg de BigLake en BigQuery con una conexión de BigQuery. BigQuery usa las credenciales de la cuenta de servicio de conexión para acceder al metastore de BigLake (clásico).
  • Conector Spark de BigQuery: cuando se usa Spark con el metastore de BigLake (clásico) en un procedimiento almacenado de Spark de BigQuery. Spark usa la credencial de la cuenta de servicio del conector de Spark para acceder al almacén de metadatos de BigLake (clásico) y crear tablas de BigQuery.
  • Cuenta de servicio de Serverless para Apache Spark: cuando se usa Spark con BigLake en Serverless para Apache Spark. Spark usa la credencial de la cuenta de servicio.
  • Cuenta de servicio de VM de Dataproc: cuando se usa Dataproc (no Serverless para Apache Spark). Apache Spark usa la credencial de la cuenta de servicio de la VM.

En función de tus permisos, puedes asignarte estos roles o pedirle a tu administrador que te los asigne. Para obtener más información sobre cómo asignar roles, consulta el artículo Ver los roles que se pueden asignar a los recursos.

Para ver los permisos exactos que se necesitan para acceder a los recursos de metastore de BigLake (clásico), despliega la sección Permisos necesarios:

Permisos obligatorios

  • biglake.tables.get a nivel de proyecto para todos los accesos de solo lectura. Consultar una tabla de Iceberg de BigLake en BigQuery es de solo lectura.
  • biglake.{catalogs|databases|tables}.* a nivel de proyecto, para todos los permisos de lectura y escritura. Normalmente, Apache Spark necesita poder leer y escribir datos, así como crear, gestionar y ver catálogos, bases de datos y tablas.
  • bigquery.connections.delegate en el nivel de conexión de recursos de Cloud de BigQuery o superior para crear una tabla de Iceberg de BigLake en una tabla de BigQuery mediante una conexión.

Conectarse a un metastore de BigLake (clásico)

En las siguientes secciones se explica cómo conectarse a BigLake Metastore (clásico). En estas secciones se instala y se usa el complemento del catálogo de Apache Iceberg de BigLake, indicado por los archivos JAR de los siguientes métodos. El complemento de catálogo se conecta a BigLake Metastore (clásico) desde motores de código abierto, como Apache Spark.

Conectarse a una VM de Dataproc

Para conectarte a BigLake Metastore (clásico) 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 declaración para instalar y configurar el catálogo personalizado de Apache Iceberg para que funcione con el metastore de BigLake (clásico):

    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
      

Haz los cambios siguientes:

  • ICEBERG_SPARK_PACKAGE: versión de Apache Iceberg con Spark que se va a usar. Te recomendamos que uses la versión de Spark que coincida con la versión de Spark de tu instancia de Dataproc o Serverless para Apache Spark. Para ver una lista de las versiones de Apache Iceberg disponibles, consulta las descargas de Apache Iceberg. Por ejemplo, la marca de Apache Spark 3.3 es:
    --packages org.apache.iceberg:iceberg-spark-runtime-3.3_2.13:1.2.1
  • BIGLAKE_ICEBERG_CATALOG_JAR: el URI de Cloud Storage del complemento de catálogo personalizado de Iceberg que se va a instalar. En función de tu entorno, selecciona una de las siguientes opciones:
    • Iceberg 1.9.1: gs://spark-lib/biglake/biglake-catalog-iceberg1.9.1-0.1.3-with-dependencies.jar
    • Iceberg 1.5.1: gs://spark-lib/biglake/biglake-catalog-iceberg1.5.1-0.1.2-with-dependencies.jar
    • Iceberg 1.5.0: gs://spark-lib/biglake/biglake-catalog-iceberg1.5.0-0.1.1-with-dependencies.jar
    • 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: el identificador de catálogo de Spark. Está vinculado a un catálogo de metastore de BigLake (clásico).
  • PROJECT_ID: el ID de proyecto del catálogo de metastore de BigLake (clásico) al que se vincula el catálogo de Spark. Google Cloud
  • LOCATION: la ubicación de Google Cloud del catálogo de Metastore de BigLake (clásico) al que se vincula el catálogo de Spark.
  • BLMS_CATALOG: el ID del catálogo del metastore de BigLake (clásico) al que se vincula el catálogo de Spark. No es necesario que exista el catálogo, y se puede crear en Spark.
  • GCS_DATA_WAREHOUSE_FOLDER: la carpeta de Cloud Storage en la que Spark crea todos los archivos. Empieza por gs://.
  • HMS_DB: (opcional) la base de datos de HMS que contiene la tabla de la que se va a copiar.
  • HMS_TABLE: (opcional) la tabla de HMS de la que se va a copiar.
  • HMS_URI: (opcional) el endpoint de HMS Thrift.

Conectarse a un clúster de Dataproc

También puedes enviar una tarea de Dataproc a un clúster. En el siguiente ejemplo se instala el catálogo personalizado de Iceberg adecuado.

Para conectarte a 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

Haz los cambios siguientes:

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

Conéctate con Google Cloud Serverless para Apache Spark

Del mismo modo, puedes enviar una carga de trabajo por lotes a Serverless para Apache Spark. Para ello, sigue las instrucciones de carga de trabajo por lotes con las siguientes marcas adicionales:

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

Conectarse con procedimientos almacenados de BigQuery

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

Crear recursos de metastore

En las siguientes secciones se describe cómo crear recursos en el metastore.

Crear catálogos

Los nombres de catálogo 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

De esta forma, se crea una base de datos de BigLake llamada "my_database" de tipo "HIVE" en el catálogo especificado por 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"
}

Crear bases de datos

Los nombres de las bases de datos tienen restricciones. Para obtener más información, consulta Limitaciones. Para asegurarse de que su recurso de base de datos es compatible con los motores de datos, le recomendamos que cree bases de datos con motores de datos en lugar de crear manualmente el cuerpo del recurso. 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 SPARK_CATALOG.BLMS_DB;

Haz los cambios siguientes:

  • BLMS_DB: el ID de la base de datos de metastore de BigLake (clásico) que se va a crear

Terraform

De esta forma, se crea una base de datos de BigLake llamada "my_database" de tipo "HIVE" en el catálogo especificado por 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"
  }
}
}

Creación de tablas

Los nombres de tabla tienen restricciones. Para obtener más información, consulta el artículo Nombres de tablas. Para crear una tabla, selecciona 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;

Haz los cambios siguientes:

  • BLMS_TABLE: el ID de la tabla de metastore de BigLake (clásico) que se va a crear

Terraform

De esta forma, se registra una tabla de metastore de BigLake (clásico) con el nombre "my_table" y el tipo "Hive" en la base de datos especificada por la variable "google_biglake_database.default.id". Ten en cuenta que la tabla debe existir antes de registrarse en el catálogo, lo que se puede hacer inicializando la tabla desde un motor como Apache Spark. Para obtener más información, consulta la documentación del proveedor de Terraform: 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 de extremo a extremo

En este ejemplo de GitHub se proporciona un ejemplo de extremo a extremo ejecutable que crea un metastore de BigLake (clásico), un catálogo, una base de datos y una tabla. Para obtener más información sobre cómo usar este ejemplo, consulta Comandos básicos de Terraform.

Copiar una tabla de Iceberg de Hive Metastore a BigLake Metastore (clásico)

Para crear una tabla de Iceberg y copiar una tabla de Hive Metastore en BigLake Metastore (clásico), 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');

Cuando creas una tabla Iceberg en Spark, puedes crear una tabla externa Iceberg vinculada al mismo tiempo.

Para crear una tabla de Iceberg en Spark y, al mismo tiempo, crear automáticamente una tabla externa de Iceberg, 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');

Haz los cambios siguientes:

  • BQ_TABLE_PATH: la ruta de la tabla externa de Iceberg que se va a crear. Sigue la sintaxis de la ruta de la tabla de BigQuery. Si no se especifica ningún proyecto, se usa el mismo que el del catálogo del metastore de BigLake (clásico).
  • 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 al metastore de BigLake (clásico). Si no se especifica, BigQuery crea una tabla externa normal en lugar de una tabla de BigLake.

Para crear manualmente enlaces de tablas externas de Iceberg con URIs de tablas de metastore de BigLake (clásico) especificados (blms://…), usa la siguiente instrucción SQL de BigQuery:

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']
          )

Ver recursos del metastore

En las siguientes secciones se describe cómo ver recursos en BigLake Metastore (clásico).

Ver catálogos

Para ver todas las bases de datos de 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.

Ver bases de datos

Para ver una base de datos, sigue estos pasos:

API

Para ver todas las tablas de 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 de 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 de una base de datos o una tabla definida, siga estos pasos:

API

Para ver todas las tablas de una base de datos, usa el método projects.locations.catalogs.databases.tables.list y especifica el nombre de la 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 de 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;

Modificar recursos de metastore

En las siguientes secciones se describe cómo modificar recursos en el metastore.

Actualizar tablas

Para evitar conflictos cuando varios trabajos intentan actualizar la misma tabla al mismo tiempo, el metastore de BigLake (clásico) usa el bloqueo optimista. Para usar el bloqueo optimista, primero debes obtener la versión actual de la tabla (llamada etag) mediante el método GetTable. Después, puedes hacer cambios en la tabla y usar el método UpdateTable, pasando el etag obtenido anteriormente. Si otra tarea actualiza la tabla después de que obtengas el etag, el método UpdateTable falla. Esta medida asegura que solo un trabajo pueda actualizar la tabla a la vez, lo que evita conflictos.

Para actualizar una tabla, selecciona 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 tablas en SQL, consulta ALTER TABLE.

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

Haz los cambios siguientes:

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

Eliminar recursos de metastore

En las siguientes secciones se describe cómo eliminar recursos en BigLake Metastore (clásico).

Eliminar catálogos

Para eliminar un catálogo, seleccione una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.delete y especifica el nombre de un catálogo. Este método no elimina los archivos asociados en Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG;

Eliminar bases de datos

Para eliminar una base de datos, seleccione una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.databases.delete y especifica el nombre de una base de datos. Este método no elimina los archivos asociados en Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG.BLMS_DB;

Cómo eliminar tablas

Para eliminar una tabla, seleccione una de las siguientes opciones:

API

Usa el método projects.locations.catalogs.databases.tables.delete y especifica el nombre de una tabla. Este método no elimina los archivos asociados en Google Cloud.

Spark SQL

Para eliminar solo la tabla, usa la siguiente instrucción:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

Para eliminar la tabla y los archivos asociados en Google Cloud, utiliza la siguiente instrucción:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE PURGE;