Gestire i metadati open source con il metastore BigLake (versione classica)

BigLake Metastore (versione classica) è un servizio di metadati fisici unificato per i prodotti di analisi dei dati su Google Cloud. BigLake Metastore (versione classica) fornisce un'unica fonte attendibile per i metadati e ti consente di gestire e accedere ai dati da più origini. Il metastore BigLake (classico) è accessibile da BigQuery e da vari motori di elaborazione dei dati aperti su Dataproc, il che lo rende uno strumento utile per analisti e tecnici dei dati.

Per la gestione dei metadati aziendali, consulta Dataplex Universal Catalog.

Come funziona il metastore BigLake (versione classica)

Il metastore BigLake (classico) è un servizio serverless che non richiede di eseguire il provisioning delle risorse prima di utilizzarlo. Puoi utilizzarlo come alternativa serverless a Hive Metastore nei cluster Dataproc. Il metastore BigLake (classico) funziona come Hive Metastore tramite le sue API compatibili con Hive e puoi eseguire immediatamente query sulle tabelle in formato aperto in BigQuery senza ulteriori passaggi. Il metastore BigLake (versione classica) supporta solo tabelle Apache Iceberg.

BigLake Metastore (versione classica) fornisce API, librerie client e integrazione del motore di dati (ad esempio Apache Spark) per gestire cataloghi, database e tabelle.

Limitazioni

Il metastore BigLake (classico) è soggetto alle seguenti limitazioni:

  • Il metastore BigLake (versione classica) non supporta le tabelle Apache Hive.
  • I ruoli e le autorizzazioni di Identity and Access Management (IAM) possono essere concessi solo ai progetti. La concessione di autorizzazioni IAM alle risorse non è supportata.
  • Cloud Monitoring non è supportato.
  • I cataloghi e i database di BigLake Metastore (classico) presentano le seguenti limitazioni per i nomi:
    • I nomi possono contenere fino a 1024 caratteri.
    • I nomi possono contenere solo lettere UTF-8 (maiuscole, minuscole), numeri e trattini bassi.
    • I nomi devono essere univoci per ogni combinazione di progetto e regione.
  • Le tabelle del metastore BigLake (classiche) rispettano le stesse convenzioni di denominazione delle tabelle BigQuery. Per ulteriori informazioni, consulta la sezione Nomi delle tabelle.

Prima di iniziare

Devi abilitare la fatturazione e l'API BigLake prima di utilizzare il metastore BigLake (classico).

  1. Chiedi all'amministratore di concederti il ruolo IAM Amministratore Service Usage (roles/serviceusage.serviceUsageAdmin) nel tuo progetto. Per ulteriori informazioni sulla concessione dei ruoli, consulta Gestire l'accesso.
  2. Abilita la fatturazione per il tuo Google Cloud progetto. Scopri come verificare se la fatturazione è attivata in un progetto.
  3. Abilita l'API BigLake.

    Abilitare l'API

Ruoli obbligatori

  • Per avere il controllo completo sulle risorse del metastore BigLake (classico), devi avere il ruolo Amministratore BigLake (roles/biglake.admin). Se utilizzi un account di servizio Connector BigQuery Spark, un account di servizio Dataproc Serverless o un account di servizio VM Dataproc, concedi all'account il ruolo Amministratore BigLake.
  • Per avere accesso in sola lettura alle risorse del metastore BigLake (classico), devi avere il ruolo Visualizzatore BigLake (roles/biglake.viewer). Ad esempio, quando esegui query su una tabella del metastore BigLake (classico) in BigQuery, l'utente o l'account di servizio della connessione BigQuery deve avere il ruolo Visualizzatore BigLake.
  • Per creare tabelle BigQuery con connessioni, devi disporre del ruolo Utente connessione BigQuery (roles/bigquery.connectionUser). Per ulteriori informazioni sulla condivisione delle connessioni, consulta Condividere le connessioni con gli utenti.

A seconda del caso d'uso, l'identità che chiama il metastore BigLake (classico) può essere costituita da utenti o account di servizio:

  • Utente: quando chiami direttamente l'API BigLake o quando esegui query su una tabella BigLake per Apache Iceberg in una tabella BigQuery senza una connessione da BigQuery. In questa circostanza, BigQuery utilizza le credenziali dell'utente.
  • Connessione alla risorsa cloud BigQuery: quando esegui una query su una tabella BigLake Iceberg in BigQuery con una connessione da BigQuery. BigQuery utilizza la credenziale dell'account di servizio di connessione per accedere al metastore BigLake (classico).
  • Connettore BigQuery Spark: quando utilizzi Spark con il metastore BigLake (classico) in una procedura memorizzata Spark di BigQuery. Spark utilizza la credenziale dell'account di servizio del connettore Spark per accedere al metastore BigLake (classico) e creare tabelle BigQuery.
  • Account di servizio Dataproc Serverless: se utilizzi Spark con BigLake in Dataproc Serverless. Spark utilizza la credenziale dell'account di servizio.
  • Account di servizio VM Dataproc: se utilizzi Dataproc (non Dataproc Serverless). Apache Spark utilizza la credenziale dell'account di servizio della VM.

A seconda delle tue autorizzazioni, puoi concederti questi ruoli o chiedere all'amministratore di concederteli. Per ulteriori informazioni sulla concessione dei ruoli, consulta Visualizzazione dei ruoli assegnabili sulle risorse.

Per visualizzare le autorizzazioni esatte necessarie per accedere alle risorse del metastore BigLake (classico), espandi la sezione Autorizzazioni richieste:

Autorizzazioni obbligatorie

  • biglake.tables.get a livello di progetto per tutti gli accessi di sola lettura. L'esecuzione di query su una tabella BigLake Iceberg in BigQuery è in sola lettura.
  • biglake.{catalogs|databases|tables}.* a livello di progetto per tutte le autorizzazioni di lettura e scrittura. In genere, Apache Spark ha bisogno della possibilità di leggere e scrivere dati, inclusa la possibilità di creare, gestire e visualizzare cataloghi, database e tabelle.
  • bigquery.connections.delegate a livello di connessione a risorse cloud BigQuery o superiore per creare una tabella BigLake Iceberg nella tabella BigQuery utilizzando una connessione.

Connettiti al metastore BigLake (versione classica)

Le sezioni seguenti spiegano come connettersi al metastore BigLake (classico). Queste sezioni installano e utilizzano il plug-in del catalogo Apache Iceberg di BigLake, indicato dai file JAR nei metodi seguenti. Il plug-in del catalogo si connette al metastore BigLake (classico) da motori open source come Apache Spark.

Connettiti a una VM Dataproc

Per connetterti al metastore BigLake (classico) con una VM Dataproc, segui questi passaggi:

  1. Utilizza SSH per connetterti a Dataproc.
  2. In Spark SQL CLI, utilizza la seguente istruzione per installare e configurare il catalogo personalizzato Apache Iceberg in modo che funzioni con il metastore BigLake (classico):

    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
      

Sostituisci quanto segue:

  • ICEBERG_SPARK_PACKAGE: la versione di Apache Iceberg con Spark da utilizzare. Ti consigliamo di utilizzare la versione di Spark corrispondente a quella dell'istanza Dataproc o Dataproc Serverless. Per visualizzare un elenco delle versioni di Apache Iceberg disponibili, consulta Download di Apache Iceberg. Ad esempio, il flag per Apache Spark 3.3 è:
    --packages org.apache.iceberg:iceberg-spark-runtime-3.3_2.13:1.2.1
  • BIGLAKE_ICEBERG_CATALOG_JAR: l'URI Cloud Storage del plug-in del catalogo personalizzato Iceberg da installare. A seconda dell'ambiente, seleziona una delle seguenti opzioni:
    • 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: l'identificatore del catalogo per Spark. È collegato a un catalogo BigLake Metastore (classico).
  • PROJECT_ID: l' Google Cloud ID progetto del catalogo del metastore BigLake (classico) a cui si collega il catalogo Spark.
  • LOCATION: la posizione Google Cloud del catalogo del metastore BigLake (classico) a cui si collega il catalogo Spark.
  • BLMS_CATALOG: l'ID catalogo del metastore BigLake (classico) a cui si collega il catalogo Spark. Il catalogo non deve necessariamente esistere e può essere creato in Spark.
  • GCS_DATA_WAREHOUSE_FOLDER: la cartella Cloud Storage in cui Spark crea tutti i file. Inizia con gs://.
  • HMS_DB: (facoltativo) il database HMS contenente la tabella da cui eseguire la copia.
  • HMS_TABLE: (facoltativo) la tabella HMS da cui copiare.
  • HMS_URI: (facoltativo) l'endpoint HMS Thrift.

Connettiti a un cluster Dataproc

In alternativa, puoi inviare un job Dataproc a un cluster. Il seguente esempio installa il catalogo personalizzato Iceberg appropriato.

Per connetterti a un cluster Dataproc, invia un job con le seguenti specifiche:

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

Sostituisci quanto segue:

  • DATAPROC_CLUSTER: il cluster Dataproc a cui inviare il job.
  • DATAPROC_PROJECT_ID: l'ID progetto del cluster Dataproc. Questo ID può essere diverso da PROJECT_ID.
  • DATAPROC_LOCATION: la posizione del cluster Dataproc. Questa località può essere diversa da LOCATION.
  • QUERY_FILE_PATH: il percorso del file contenente le query da eseguire.

Connettiti a Dataproc Serverless

Analogamente, puoi inviare un carico di lavoro batch a Dataproc Serverless. Per farlo, segui le istruzioni per i carichi di lavoro batch con i seguenti flag aggiuntivi:

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

Eseguire il collegamento con le stored procedure BigQuery

Puoi utilizzare le stored procedure BigQuery per eseguire job Dataproc Serverless. Il processo è simile all'esecuzione di job Dataproc Serverless direttamente in Dataproc.

Creare risorse Metastore

Le sezioni seguenti descrivono come creare risorse nel metastore.

Creare cataloghi

I nomi dei cataloghi hanno delle limitazioni. Per ulteriori informazioni, consulta la sezione Limitazioni. Per creare un catalogo, seleziona una delle seguenti opzioni:

API

Utilizza il metodo projects.locations.catalogs.create e specifica il nome di un catalogo.

Spark SQL

CREATE NAMESPACE SPARK_CATALOG;

Terraform

Viene creato un database BigLake denominato "my_database" di tipo 'HIVE' nel catalogo specificato dalla variabile 'google_biglake_catalog.default.id'. Per saperne di più, consulta la documentazione di Terraform BigLake.

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

Creare database

I nomi dei database hanno delle limitazioni. Per ulteriori informazioni, consulta la sezione Limitazioni. Per assicurarti che la risorsa del database sia compatibile con i motori di dati, ti consigliamo di creare i database utilizzando i motori di dati anziché creare manualmente il corpo della risorsa. Per creare un database, seleziona una delle seguenti opzioni:

API

Utilizza il metodo projects.locations.catalogs.databases.create e specifica il nome di un database.

Spark SQL

CREATE NAMESPACE SPARK_CATALOG.BLMS_DB;

Sostituisci quanto segue:

  • BLMS_DB: l'ID del database BigLake Metastore (classico) da creare

Terraform

Viene creato un database BigLake denominato "my_database" di tipo 'HIVE' nel catalogo specificato dalla variabile 'google_biglake_catalog.default.id'. Per saperne di più, consulta la documentazione di 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"
  }
}
}

Crea tabelle

I nomi delle tabelle hanno vincoli. Per ulteriori informazioni, consulta la sezione Nomi delle tabelle. Per creare una tabella, seleziona una delle seguenti opzioni:

API

Utilizza il metodo projects.locations.catalogs.databases.tables.create e specifica il nome di una tabella.

Spark SQL

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

Sostituisci quanto segue:

  • BLMS_TABLE: l'ID tabella del metastore BigLake (classico) da creare

Terraform

Viene registrata una tabella BigLake Metastore (classica) con il nome "my_table" e il tipo "Hive" nel database specificato dalla variabile "google_biglake_database.default.id". Tieni presente che la tabella deve esistere prima della registrazione nel catalogo, il che può essere ottenuto inizializzando la tabella da un motore come Apache Spark. Per ulteriori informazioni, consulta la documentazione del provider Terraform: BigLake Table.

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

Esempio di Terraform E2E

Questo esempio GitHub fornisce un esempio E2E eseguibile che crea un catalogo, un database e una tabella del metastore BigLake (classico). Per ulteriori informazioni su come utilizzare questo esempio, consulta Comandi Terraform di base.

Copiare una tabella Iceberg dal metastore Hive al metastore BigLake (versione classica)

Per creare una tabella Iceberg e copiare una tabella del metastore Hive nel metastore BigLake (classico), utilizza la seguente istruzione Spark SQL:

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

Quando crei una tabella Iceberg in Spark, puoi anche creare contemporaneamente una tabella Iceberg di sola lettura collegata.

Per creare una tabella Iceberg in Spark e contemporaneamente una tabella Iceberg di sola lettura, utilizza la seguente istruzione 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');

Sostituisci quanto segue:

  • BQ_TABLE_PATH: il percorso della tabella di sola lettura Iceberg da creare. Segui la sintassi del percorso della tabella BigQuery. Utilizza lo stesso progetto del catalogo del metastore BigLake (versione classica) se il progetto non è specificato.
  • BQ_RESOURCE_CONNECTION (facoltativo): il formato è project.location.connection-id. Se specificato, le query BigQuery utilizzano le credenziali della connessione alla risorsa Cloud per accedere al metastore BigLake (classico). Se non specificato, BigQuery crea una tabella esterna normale anziché una tabella BigLake.

Per creare manualmente i link alle tabelle di sola lettura di Iceberg con gli URI delle tabelle del metastore BigLake (classiche) specificati (blms://…), utilizza il seguente istruzione SQL di 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']
          )

Visualizza le risorse del metastore

Le sezioni seguenti descrivono come visualizzare le risorse nel metastore BigLake (classico).

Visualizzare i cataloghi

Per visualizzare tutti i database di un catalogo, utilizza il metodo projects.locations.catalogs.list e specifica il nome di un catalogo.

Per visualizzare le informazioni su un catalogo, utilizza il metodo projects.locations.catalogs.get e specifica il nome di un catalogo.

Visualizza i database

Per visualizzare un database:

API

Per visualizzare tutte le tabelle di un database, utilizza il metodo projects.locations.catalogs.databases.list e specifica il nome di un database.

Per visualizzare le informazioni su un database, utilizza il metodo projects.locations.catalogs.databases.get e specifica il nome di un database.

Spark SQL

Per visualizzare tutti i database in un catalogo, utilizza la seguente istruzione:

SHOW { DATABASES | NAMESPACES } IN SPARK_CATALOG;

Per visualizzare le informazioni su un database definito, utilizza la seguente dichiarazione:

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

Visualizza tabelle

Per visualizzare tutte le tabelle di un database o una tabella definita:

API

Per visualizzare tutte le tabelle di un database, utilizza il metodo projects.locations.catalogs.databases.tables.list e specifica il nome di un database.

Per visualizzare le informazioni su una tabella, utilizza il metodo projects.locations.catalogs.databases.tables.get e specifica il nome di una tabella.

Spark SQL

Per visualizzare tutte le tabelle di un database, utilizza la seguente istruzione:

SHOW TABLES IN SPARK_CATALOG.BLMS_DB;

Per visualizzare le informazioni su una tabella definita, utilizza la seguente istruzione:

DESCRIBE TABLE [EXTENDED] SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

Modificare le risorse del metastore

Le sezioni seguenti descrivono come modificare le risorse nel metastore.

Aggiorna le tabelle

Per evitare conflitti quando più job tentano di aggiornare la stessa tabella contemporaneamente, il metastore BigLake (classico) utilizza il blocco ottimistico. Per utilizzare il blocco ottimistico, devi prima recuperare la versione corrente della tabella (chiamata etag) utilizzando il metodo GetTable. Poi puoi apportare modifiche alla tabella e utilizzare il metodo UpdateTable, passando l'etag recuperato in precedenza. Se un altro job aggiorna la tabella dopo aver recuperato l'etag, il metodo UpdateTable non va a buon fine. Questa misura garantisce che solo un job possa aggiornare la tabella alla volta, evitando conflitti.

Per aggiornare una tabella, seleziona una delle seguenti opzioni:

API

Utilizza il metodo projects.locations.catalogs.databases.tables.patch e specifica il nome di una tabella.

Spark SQL

Per le opzioni di aggiornamento delle tabelle in SQL, consulta ALTER TABLE.

Rinominare le tabelle

Per rinominare una tabella, seleziona una delle seguenti opzioni:

API

Utilizza il metodo projects.locations.catalogs.databases.tables.rename e specifica il nome di una tabella e un valore newName.

Spark SQL

ALTER TABLE BLMS_TABLE RENAME TO NEW_BLMS_TABLE;

Sostituisci quanto segue:

  • NEW_BLMS_TABLE: il nuovo nome di BLMS_TABLE. Deve trovarsi nello stesso set di dati diBLMS_TABLE.

Eliminare le risorse del metastore

Le sezioni seguenti descrivono come eliminare le risorse nel metastore BigLake (classico).

Eliminare i cataloghi

Per eliminare un catalogo, seleziona una delle seguenti opzioni:

API

Utilizza il metodo projects.locations.catalogs.delete e specifica il nome di un catalogo. Questo metodo non elimina i file associati su Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG;

Eliminare i database

Per eliminare un database, seleziona una delle seguenti opzioni:

API

Utilizza il metodo projects.locations.catalogs.databases.delete e specifica il nome di un database. Questo metodo non elimina i file associati su Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG.BLMS_DB;

Eliminare le tabelle

Per eliminare una tabella, seleziona una delle seguenti opzioni:

API

Utilizza il metodo projects.locations.catalogs.databases.tables.delete e specifica il nome di una tabella. Questo metodo non elimina i file associati su Google Cloud.

Spark SQL

Per eliminare solo la tabella, utilizza la seguente istruzione:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

Per eliminare la tabella ed eliminare i file associati su Google Cloud, utilizza la seguente istruzione:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE PURGE;