Gerenciar recursos do Iceberg no metastore do BigLake

O metastore do BigLake é um metastore único e compartilhado que permite o compartilhamento de dados entre mecanismos de processamento de dados, eliminando a necessidade de manter metastores separados para suas cargas de trabalho de código aberto.

Neste documento, explicamos como criar, visualizar, modificar e excluir recursos do Iceberg no BigLake Metastore.

Antes de começar

  1. Make sure that billing is enabled for your Google Cloud project.

    Saiba como verificar se o faturamento está ativado em um projeto.
  2. Enable the BigQuery, BigQuery Storage, and Dataproc APIs.

    Enable the APIs

  3. Opcional: entenda como o BigLake Metastore funciona e por que você deve usá-lo.

Funções exigidas

Para ter as permissões necessárias para gerenciar recursos do Iceberg no metastore do BigLake, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.

Criar recursos do Metastore

As seções a seguir descrevem como criar recursos no metastore do BigLake.

Criar namespaces

Selecione uma das seguintes opções:

API

Use o método datasets.insert e especifique o campo ExternalCatalogDatasetOptions no recurso do conjunto de dados que você transmite.

{
  "datasetReference": {
    "projectId": "PROJECT_ID",
    "datasetId": "DATASET_ID"
  },
  "externalCatalogDatasetOptions": {
    "defaultStorageLocationUri": "URI",
    "parameters": {
      ...
    }
  },
  "location": "LOCATION"
}

Substitua:

  • PROJECT_ID: o ID do projeto que contém o conjunto de dados de destino
  • DATASET_ID: o ID do conjunto de dados de destino
  • URI: o URI do Cloud Storage de todas as tabelas no conjunto de dados
  • LOCATION: o local do BigQuery em que você quer criar o conjunto de dados

Spark SQL

CREATE NAMESPACE SPARK_CATALOG.NAMESPACE;

Substitua:

  • SPARK_CATALOG: o nome do catálogo do Spark
  • NAMESPACE: o nome do novo namespace

Terraform

provider "google" {
  project = "PROJECT_ID"
}

resource "google_bigquery_dataset" "default" {
  dataset_id = "DATASET_ID"
  location   = "LOCATION"

  external_catalog_dataset_options {
    default_storage_location_uri = "URI"
    parameters = {
      ...
    }
  }
}

Substitua:

  • PROJECT_ID: o ID do projeto que contém o conjunto de dados de destino
  • DATASET_ID: o ID do conjunto de dados de destino
  • LOCATION: o local do BigQuery em que você quer criar o conjunto de dados
  • URI: o URI do Cloud Storage de todas as tabelas no conjunto de dados

Criar tabelas Iceberg

Selecione uma das seguintes opções:

API

Use o método tables.insert e especifique o campo ExternalCatalogTableOptions no recurso de tabela que você transmite para a API.

{
  "tableReference": {
    "projectId": "PROJECT_ID",
    "datasetId": "DATASET_ID",
    "tableId": "TABLE_ID"
  },
  "externalCatalogTableOptions": {
    "parameters": {
      "table_type": "iceberg",
      "metadata_location": "METADATA_URI"
    },
    "connection_id": "CONNECTION_ID"
  }
}

Substitua:

  • PROJECT_ID: o ID do projeto que contém a tabela de destino.
  • DATASET_ID: o ID do conjunto de dados que contém a tabela de destino.
  • TABLE_ID: o ID da tabela de destino.
  • METADATA_URI: o URI do Cloud Storage do arquivo de metadados do Iceberg mais recente. Por exemplo, gs://mybucket/mytable/metadata/1234.metadata.json.
  • CONNECTION_ID: o ID da sua conexão com o Cloud Storage.

Spark SQL

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

Substitua:

  • SPARK_CATALOG: o nome do catálogo do Spark
  • NAMESPACE: o nome do namespace.
  • TABLE: o nome da nova tabela

Terraform

resource "google_bigquery_table" "default" {
  deletion_protection = false
  dataset_id          = google_bigquery_dataset.default.dataset_id
  table_id            = "TABLE"

  external_catalog_table_options {
    storage_descriptor {
      location_uri  = "STORAGE_URI"
      input_format  = "org.apache.hadoop.mapred.FileInputFormat"
      output_format = "org.apache.hadoop.mapred.FileOutputFormat"
    }
    parameters = {
      "table_type"        = "iceberg"
      "metadata_location" = "METADATA_URI"
      "write.parquet.compression-codec" : "zstd"
      "EXTERNAL" : "TRUE"
    }
  }
}

Substitua:

  • TABLE: o nome da tabela de destino.
  • STORAGE_URI: o URI do Cloud Storage em que os dados da tabela são armazenados, começando com gs://.
  • METADATA_URI: o URI do Cloud Storage do arquivo de metadados do Iceberg mais recente. Por exemplo, gs://mybucket/mytable/metadata/1234.metadata.json.

Conferir recursos do Metastore

As seções a seguir descrevem como visualizar recursos no metastore do BigLake.

Ver namespaces

Selecione uma das seguintes opções:

API

Use o método datasets.list para conferir todos os namespaces ou o método datasets.get para conferir informações sobre um namespace definido.

Spark SQL

Para conferir todos os namespaces em um catálogo, use a seguinte instrução:

SHOW { DATABASES | NAMESPACES } IN SPARK_CATALOG;

Substitua SPARK_CATALOG pelo nome do seu catálogo do Spark.

Para conferir informações sobre um namespace definido, use a seguinte instrução:

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

Substitua:

  • SPARK_CATALOG: o nome do catálogo do Spark
  • NAMESPACE: o nome do namespace.

Visualizar tabelas

Selecione uma das seguintes opções:

API

Use o método tables.list para conferir todas as tabelas em um namespace ou o método tables.get para conferir informações sobre uma tabela definida.

Spark SQL

Para conferir todas as tabelas em um namespace, use a seguinte instrução:

SHOW TABLES IN SPARK_CATALOG.NAMESPACE;

Substitua:

  • SPARK_CATALOG: o nome do catálogo do Spark
  • NAMESPACE: o nome do namespace.

Para conferir informações sobre uma tabela definida, use a seguinte instrução:

DESCRIBE TABLE [EXTENDED]
SPARK_CATALOG.NAMESPACE.TABLE;

Substitua:

  • SPARK_CATALOG: o nome do catálogo do Spark
  • NAMESPACE: o nome do namespace.
  • TABLE: o nome da tabela.

Modificar recursos do metastore

As seções a seguir descrevem como modificar recursos no metastore do BigLake.

Atualizar namespaces

Selecione uma das seguintes opções:

API

Use o método datasets.patch e atualize o campo ExternalCatalogDatasetOptions no recurso do conjunto de dados. O método datasets.update não é recomendado porque substitui todo o recurso do conjunto de dados.

Spark SQL

Use a instrução ALTER DATABASE.

Atualizar tabelas do Iceberg

Selecione uma das seguintes opções:

API

Use o método tables.patch e atualize o campo ExternalCatalogTableOptions no recurso de tabela. O método tables.update não é recomendado porque substitui todo o recurso da tabela.

Para atualizar o esquema ou o arquivo de metadados, use o método tables.patch e defina a propriedade autodetect_schema como "true":

PATCH https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID?autodetect_schema=true

Substitua:

  • PROJECT_ID: o ID do projeto que contém a tabela que você quer atualizar
  • DATASET_ID: o ID do conjunto de dados que contém a tabela que você quer atualizar.
  • TABLE_ID: o ID da tabela que você quer atualizar.

No corpo da solicitação, especifique o valor atualizado de cada campo. Por exemplo, para atualizar o local dos metadados da tabela Iceberg, especifique o valor atualizado do campo metadata_location:

{
  "externalCatalogTableOptions": {
    "parameters": {"metadata_location": "METADATA_URI"}
  },
  "schema": null
}'

Substitua METADATA_URI pelo URI do Cloud Storage do arquivo de metadados mais recente do Iceberg. Por exemplo, gs://mybucket/mytable/metadata/1234.metadata.json.

Spark SQL

Use a instrução ALTER TABLE.

Excluir recursos do Metastore

As seções a seguir descrevem como excluir recursos no metastore do BigLake.

Excluir namespaces

Selecione uma das seguintes opções:

API

Use o método datasets.delete. Defina o parâmetro deleteContents como "true" para excluir as tabelas no seu namespace.

Spark SQL

DROP NAMESPACE SPARK_CATALOG.NAMESPACE;

Substitua:

  • SPARK_CATALOG: o nome do catálogo do Spark
  • NAMESPACE: o nome do namespace.

Excluir tabelas

Selecione uma das seguintes opções:

API

Use o método tables.delete e especifique o nome da tabela. Esse método não exclui os arquivos associados no Cloud Storage.

Spark SQL

Para descartar apenas a tabela, use a seguinte instrução:

DROP TABLE SPARK_CATALOG.NAMESPACE.TABLE;

Substitua:

  • SPARK_CATALOG: o nome do catálogo do Spark
  • NAMESPACE: o nome do namespace.
  • TABLE: o nome da tabela a ser excluída

Para descartar a tabela e excluir os arquivos associados no Cloud Storage, use a seguinte instrução:

DROP TABLE SPARK_CATALOG.NAMESPACE.TABLE PURGE;

Substitua:

  • SPARK_CATALOG: o nome do catálogo do Spark
  • NAMESPACE: o nome do namespace.
  • TABLE: o nome da tabela a ser excluída

A seguir