Faça a gestão de metadados de código aberto com o metastore do BigLake (clássico)
O metastore do BigLake (clássico) é um serviço de metadados físicos unificado para produtos de estatísticas de dados no Google Cloud. O metastore do BigLake (clássico) oferece uma única fonte de informações verdadeiras para metadados e permite-lhe gerir e aceder a dados de várias origens. O metastore do BigLake (clássico) é acessível a partir do BigQuery e de vários motores de processamento de dados abertos no Dataproc, o que o torna uma ferramenta útil para analistas e engenheiros de dados.
Para a gestão de metadados empresariais, consulte o catálogo universal do Dataplex.
Como funciona o metastore do BigLake (clássico)
O metastore do BigLake (clássico) é um serviço sem servidor que não requer o aprovisionamento de recursos antes de o usar. Pode usá-lo como uma alternativa sem servidor ao Hive Metastore em clusters do Dataproc. As funções da metastore do BigLake (clássica) funcionam da mesma forma que a metastore do Hive através das respetivas APIs compatíveis com o Hive, e pode consultar imediatamente tabelas de formato aberto no BigQuery sem mais passos. O metastore do BigLake (clássico) só é compatível com tabelas do Apache Iceberg.
O metastore do BigLake (clássico) fornece APIs, bibliotecas cliente e integração do motor de dados (como o Apache Spark) para gerir catálogos, bases de dados e tabelas.
Limitações
O metastore do BigLake (clássico) está sujeito às seguintes limitações:
- O metastore do BigLake (clássico) não suporta tabelas do Apache Hive.
- As funções e as autorizações da gestão de identidade e de acesso (IAM) só podem ser concedidas a projetos. A atribuição de autorizações de IAM a recursos não é suportada.
- O Cloud Monitoring não é suportado.
- Os catálogos e as bases de dados do metastore do BigLake (clássico) têm as seguintes
limitações de nomenclatura:
- Os nomes podem ter até 1024 carateres.
- Os nomes só podem conter letras UTF-8 (maiúsculas e minúsculas), números e sublinhados.
- Os nomes têm de ser exclusivos para cada combinação de projeto e região.
- As tabelas do metastore do BigLake (clássico) seguem as mesmas convenções de nomenclatura que as tabelas do BigQuery. Para mais informações, consulte o artigo Nomenclatura de tabelas.
Antes de começar
Tem de ativar a faturação e a API BigLake antes de usar o metastore do BigLake (clássico).
- Peça ao administrador para lhe conceder a função de administrador da utilização de serviços (
roles/serviceusage.serviceUsageAdmin
) do IAM no seu projeto. Para mais informações sobre a concessão de funções, consulte o artigo Gerir acesso. - Ative a faturação para o seu Google Cloud projeto. Saiba como verificar se a faturação está ativada num projeto.
Ative a API BigLake.
Funções necessárias
- Para ter controlo total sobre os recursos do metastore do BigLake (clássico),
precisa da função de administrador do BigLake (
roles/biglake.admin
). Se estiver a usar uma conta de serviço do conetor do BigQuery Spark, uma conta de serviço do Serverless para Apache Spark ou uma conta de serviço da VM do Dataproc, conceda a função de administrador do BigLake à conta. - Para ter acesso só de leitura aos recursos do metastore do BigLake (clássico),
precisa da função de visitante do BigLake (
roles/biglake.viewer
). Por exemplo, quando consultar uma tabela do metastore do BigLake (clássico) no BigQuery, o utilizador ou a conta de serviço da ligação do BigQuery tem de ter a função de visitante do BigLake. - Para criar tabelas do BigQuery com associações, precisa da função
Utilizador da associação do BigQuery
(
roles/bigquery.connectionUser
). Para mais informações sobre a partilha de associações, consulte o artigo Partilhe associações com utilizadores.
Consoante o exemplo de utilização, a identidade que chama o metastore do BigLake (clássico) pode ser de utilizadores ou contas de serviço:
- Utilizador: quando chama diretamente a API BigLake ou quando consulta uma tabela BigLake para Apache Iceberg numa tabela do BigQuery sem uma ligação do BigQuery. Nesta circunstância, o BigQuery usa as credenciais do utilizador.
- Ligação de recursos do Google Cloud do BigQuery: quando consulta uma tabela Iceberg do BigLake no BigQuery com uma ligação do BigQuery. O BigQuery usa a credencial da conta de serviço de ligação para aceder ao metastore do BigLake (clássico).
- Conetor do BigQuery Spark: quando usa o Spark com o metastore do BigLake (clássico) num procedimento armazenado do Spark do BigQuery. O Spark usa a credencial da conta de serviço do conetor do Spark para aceder ao metastore do BigLake (clássico) e criar tabelas do BigQuery.
- Conta de serviço sem servidor para o Apache Spark: quando usar o Spark com o BigLake no sem servidor para o Apache Spark. O Spark usa a credencial da conta de serviço.
- Conta de serviço da VM do Dataproc: quando usar o Dataproc (não o Serverless para Apache Spark). O Apache Spark usa a credencial da conta de serviço da VM.
Consoante as suas autorizações, pode atribuir estas funções a si próprio ou pedir ao seu administrador que as atribua. Para mais informações sobre a atribuição de funções, consulte o artigo Ver as funções atribuíveis em recursos.
Para ver as autorizações exatas necessárias para aceder aos recursos do metastore do BigLake (clássico), expanda a secção Autorizações necessárias:
Autorizações necessárias
biglake.tables.get
ao nível do projeto, para todos os acessos só de leitura. A consulta de uma tabela Iceberg do BigLake numa tabela do BigQuery é só de leitura.biglake.{catalogs|databases|tables}.*
ao nível do projeto, para todas as autorizações de leitura e escrita. Normalmente, o Apache Spark precisa de poder ler e escrever dados, incluindo a capacidade de criar, gerir e ver catálogos, bases de dados e tabelas.bigquery.connections.delegate
ao nível da ligação de recursos do Google Cloud do BigQuery ou superior, para criar uma tabela Iceberg do BigLake na tabela do BigQuery através de uma ligação.
Associe-se ao metastore do BigLake (clássico)
As secções seguintes explicam como estabelecer ligação ao metastore do BigLake (clássico). Estas secções instalam e usam o plug-in do catálogo do Apache Iceberg do BigLake, indicado pelos ficheiros JAR nos seguintes métodos. O plug-in de catálogo liga-se ao metastore do BigLake (clássico) a partir de motores de código aberto, como o Apache Spark.
Estabeleça ligação a uma VM do Dataproc
Para estabelecer ligação ao metastore do BigLake (clássico) com uma VM do Dataproc, faça o seguinte:
- Use o SSH para estabelecer ligação ao Dataproc.
Na CLI do Spark SQL, use a seguinte declaração para instalar e configurar o catálogo personalizado do Apache Iceberg para funcionar com o metastore do BigLake (clássico):
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
Substitua o seguinte:
ICEBERG_SPARK_PACKAGE
: a versão do Apache Iceberg com Spark a usar. Recomendamos que use a versão do Spark que corresponde à versão do Spark na sua instância do Dataproc ou do Serverless para Apache Spark. Para ver uma lista das versões disponíveis do Apache Iceberg, consulte a página Transferências do Apache Iceberg. Por exemplo, a flag para o Apache Spark 3.3 é:
--packages org.apache.iceberg:iceberg-spark-runtime-3.3_2.13:1.2.1
BIGLAKE_ICEBERG_CATALOG_JAR
: o URI do Cloud Storage do plug-in do catálogo personalizado do Iceberg a instalar. Consoante o seu ambiente, selecione uma das seguintes opções:Iceberg 1.9.1
: gs://spark-lib/biglake/biglake-catalog-iceberg1.9.1-0.1.3-with-dependencies.jarIceberg 1.5.1
: gs://spark-lib/biglake/biglake-catalog-iceberg1.5.1-0.1.2-with-dependencies.jarIceberg 1.5.0
: gs://spark-lib/biglake/biglake-catalog-iceberg1.5.0-0.1.1-with-dependencies.jarIceberg 1.2.0
: gs://spark-lib/biglake/biglake-catalog-iceberg1.2.0-0.1.1-with-dependencies.jarIceberg 0.14.0
: gs://spark-lib/biglake/biglake-catalog-iceberg0.14.0-0.1.1-with-dependencies.jar
SPARK_CATALOG
: o identificador do catálogo para o Spark. Está associado a um catálogo do metastore do BigLake (clássico).PROJECT_ID
: o Google Cloud ID do projeto do catálogo do metastore (clássico) do BigLake ao qual o catálogo do Spark está associado.LOCATION
: a localização do Google Cloud do catálogo da metastore do BigLake (clássico) com o qual o catálogo do Spark tem uma ligação.BLMS_CATALOG
: o ID do catálogo da metastore do BigLake (clássico) ao qual o catálogo do Spark está associado. O catálogo não tem de existir e pode ser criado no Spark.GCS_DATA_WAREHOUSE_FOLDER
: a pasta de armazenamento na nuvem onde o Spark cria todos os ficheiros. Começa à(s)gs://
.HMS_DB
: (opcional) a base de dados do HMS que contém a tabela a copiar.HMS_TABLE
: (opcional) a tabela HMS a partir da qual copiar.HMS_URI
: (opcional) o ponto final do HMS Thrift.
Estabeleça ligação a um cluster do Dataproc
Em alternativa, pode enviar uma tarefa do Dataproc para um cluster. O exemplo seguinte instala o catálogo personalizado do Iceberg adequado.
Para se ligar a um cluster do Dataproc, envie uma tarefa com as seguintes especificações:
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
Substitua o seguinte:
DATAPROC_CLUSTER
: o cluster do Dataproc ao qual enviar a tarefa.DATAPROC_PROJECT_ID
: o ID do projeto do cluster do Dataproc. Este ID pode ser diferente doPROJECT_ID
.DATAPROC_LOCATION
: a localização do cluster do Dataproc. Esta localização pode ser diferente deLOCATION
.QUERY_FILE_PATH
: o caminho para o ficheiro que contém as consultas a executar.
Estabeleça ligação ao Google Cloud Serverless para Apache Spark
Da mesma forma, pode enviar uma carga de trabalho em lote para o Serverless for Apache Spark. Para o fazer, siga as instruções de carga de trabalho em lote com as seguintes flags adicionais:
--properties="${CONFS}"
--jars=BIGLAKE_ICEBERG_CATALOG_JAR
Estabeleça ligação com procedimentos armazenados do BigQuery
Pode usar procedimentos armazenados do BigQuery para executar tarefas do Serverless para Apache Spark. O processo é semelhante à execução de tarefas do Serverless para Apache Spark diretamente no Serverless para Apache Spark.
Crie recursos do metastore
As secções seguintes descrevem como criar recursos no metadados.
Crie catálogos
Os nomes dos catálogos têm restrições. Para mais informações, consulte as Limitações. Para criar um catálogo, selecione uma das seguintes opções:
API
Use o método
projects.locations.catalogs.create
e especifique o nome de um catálogo.
Spark SQL
CREATE NAMESPACE SPARK_CATALOG;
Terraform
Isto cria uma base de dados do BigLake denominada "my_database" do tipo "HIVE" no catálogo especificado pela variável "google_biglake_catalog.default.id". Para mais informações, consulte a documentação do Terraform BigLake.
resource "google_biglake_catalog" "default" { name = "my_catalog" location = "US" }
Crie bases de dados
Os nomes das bases de dados têm restrições. Para mais informações, consulte as Limitações. Para garantir que o recurso de base de dados é compatível com os motores de dados, recomendamos que crie bases de dados com motores de dados em vez de criar manualmente o corpo do recurso. Para criar uma base de dados, selecione uma das seguintes opções:
API
Use o método
projects.locations.catalogs.databases.create
e especifique o nome de uma base de dados.
Spark SQL
CREATE NAMESPACE SPARK_CATALOG.BLMS_DB;
Substitua o seguinte:
BLMS_DB
: o ID da base de dados do metastore do BigLake (clássico) a criar
Terraform
Isto cria uma base de dados do BigLake denominada "my_database" do tipo "HIVE" no catálogo especificado pela variável "google_biglake_catalog.default.id". Para mais informações, consulte a documentação do 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" } } }
Crie tabelas
Os nomes das tabelas têm restrições. Para mais informações, consulte o artigo Nomenclatura de tabelas. Para criar uma tabela, selecione uma das seguintes opções:
API
Use o método
projects.locations.catalogs.databases.tables.create
e especifique o nome de uma tabela.
Spark SQL
CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE (id bigint, data string) USING iceberg;
Substitua o seguinte:
BLMS_TABLE
: o ID da tabela do metastore (clássico) do BigLake a criar
Terraform
Isto regista uma tabela da metastore (clássica) do BigLake com o nome "my_table" e o tipo "Hive" na base de dados especificada pela variável "google_biglake_database.default.id". Tenha em atenção que a tabela tem de existir antes do registo no catálogo, o que pode ser feito inicializando a tabela a partir de um motor, como o Apache Spark. Consulte a documentação do fornecedor do Terraform para mais informações: Tabela do 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" } } }
Exemplo do Terraform E2E
Este exemplo do GitHub fornece um exemplo E2E executável que cria um metastore (clássico) do BigLake Catálogo, base de dados e tabela. Para mais informações sobre como usar este exemplo, consulte o artigo Comandos básicos do Terraform.
Copie uma tabela Iceberg do Hive Metastore para o metastore do BigLake (clássico)
Para criar uma tabela Iceberg e copiar uma tabela do Hive Metastore para o metastore do BigLake (clássico), use a seguinte declaração do Spark SQL:
CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE (id bigint, data string) USING iceberg TBLPROPERTIES(hms_table='HMS_DB.HMS_TABLE');
Associe tabelas do BigLake a tabelas do metastore do BigLake (clássico)
Quando cria uma tabela Iceberg no Spark, pode, opcionalmente, criar uma tabela externa Iceberg associada ao mesmo tempo.
Associe tabelas automaticamente
Para criar uma tabela Iceberg no Spark e criar automaticamente uma tabela externa Iceberg ao mesmo tempo, use a seguinte declaração SQL do Spark:
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');
Substitua o seguinte:
BQ_TABLE_PATH
: o caminho da tabela externa do Iceberg a criar. Siga a sintaxe do caminho da tabela do BigQuery. Usa o mesmo projeto que o catálogo do metastore (clássico) do BigLake se o projeto não for especificado.BQ_RESOURCE_CONNECTION
(opcional): o formato éproject.location.connection-id
. Se especificado, as consultas do BigQuery usam as credenciais da ligação de recursos na nuvem para aceder ao metastore do BigLake (clássico). Se não for especificado, o BigQuery cria uma tabela externa normal em vez de uma tabela do BigLake.
Associe tabelas manualmente
Para criar manualmente associações de tabelas externas do Iceberg com URIs de tabelas de metastore do BigLake (clássico) especificados (blms://…
), use a seguinte declaração SQL do 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'] )
Veja recursos do metastore
As secções seguintes descrevem como ver recursos no metastore do BigLake (clássico).
Ver catálogos
Para ver todas as bases de dados num catálogo, use o método
projects.locations.catalogs.list
e especifique o nome de um catálogo.
Para ver informações sobre um catálogo, use o método
projects.locations.catalogs.get
e especifique o nome de um catálogo.
Ver bases de dados
Para ver uma base de dados, faça o seguinte:
API
Para ver todas as tabelas numa base de dados, use o método
projects.locations.catalogs.databases.list
e especifique o nome de uma base de dados.
Para ver informações sobre uma base de dados, use o método
projects.locations.catalogs.databases.get
e especifique o nome de uma base de dados.
Spark SQL
Para ver todas as bases de dados num catálogo, use a seguinte declaração:
SHOW { DATABASES | NAMESPACES } IN SPARK_CATALOG;
Para ver informações sobre uma base de dados definida, use a seguinte declaração:
DESCRIBE { DATABASE | NAMESPACE } [EXTENDED] SPARK_CATALOG.BLMS_DB;
Ver tabelas
Para ver todas as tabelas numa base de dados ou ver uma tabela definida, faça o seguinte:
API
Para ver todas as tabelas numa base de dados, use o método
projects.locations.catalogs.databases.tables.list
e especifique o nome de uma base de dados.
Para ver informações sobre uma tabela, use o método
projects.locations.catalogs.databases.tables.get
e especifique o nome de uma tabela.
Spark SQL
Para ver todas as tabelas numa base de dados, use a seguinte declaração:
SHOW TABLES IN SPARK_CATALOG.BLMS_DB;
Para ver informações sobre uma tabela definida, use a seguinte declaração:
DESCRIBE TABLE [EXTENDED] SPARK_CATALOG.BLMS_DB.BLMS_TABLE;
Modifique recursos do metastore
As secções seguintes descrevem como modificar recursos no metastore.
Atualize tabelas
Para evitar conflitos quando várias tarefas tentam atualizar a mesma tabela ao mesmo tempo, o metastore do BigLake (clássico) usa o bloqueio otimista. Para usar o bloqueio otimista, primeiro tem de obter a versão atual da tabela (denominada etag) através do método GetTable
. Em seguida, pode fazer alterações
à tabela e usar o método UpdateTable
, transmitindo o etag obtido
anteriormente. Se outra tarefa atualizar a tabela depois de obter a etag,
o método UpdateTable
falha. Esta medida garante que apenas um trabalho pode atualizar a tabela de cada vez, evitando conflitos.
Para atualizar uma tabela, selecione uma das seguintes opções:
API
Use o método
projects.locations.catalogs.databases.tables.patch
e especifique o nome de uma tabela.
Spark SQL
Para ver opções de atualização de tabelas em SQL, consulte
ALTER TABLE
.
Mude o nome das tabelas
Para mudar o nome de uma tabela, selecione uma das seguintes opções:
API
Use o método
projects.locations.catalogs.databases.tables.rename
e especifique o nome de uma tabela e um valor newName
.
Spark SQL
ALTER TABLE BLMS_TABLE RENAME TO NEW_BLMS_TABLE;
Substitua o seguinte:
NEW_BLMS_TABLE
: o novo nome deBLMS_TABLE
. Tem de estar no mesmo conjunto de dados queBLMS_TABLE
.
Elimine recursos do metastore
As secções seguintes descrevem como eliminar recursos no metastore do BigLake (clássico).
Elimine catálogos
Para eliminar um catálogo, selecione uma das seguintes opções:
API
Use o método
projects.locations.catalogs.delete
e especifique o nome de um catálogo. Este método não elimina os ficheiros associados no Google Cloud.
Spark SQL
DROP NAMESPACE SPARK_CATALOG;
Elimine bases de dados
Para eliminar uma base de dados, selecione uma das seguintes opções:
API
Use o método
projects.locations.catalogs.databases.delete
e especifique o nome de uma base de dados. Este método não elimina os ficheiros associados no Google Cloud.
Spark SQL
DROP NAMESPACE SPARK_CATALOG.BLMS_DB;
Elimine tabelas
Para eliminar uma tabela, selecione uma das seguintes opções:
API
Use o método
projects.locations.catalogs.databases.tables.delete
e especifique o nome de uma tabela. Este método não elimina os ficheiros associados no Google Cloud.
Spark SQL
Para eliminar apenas a tabela, use a seguinte declaração:
DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE;
Para eliminar a tabela e os ficheiros associados no Google Cloud, use a seguinte declaração:
DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE PURGE;