Exporte dados para o Pub/Sub (ETL inverso)
A exportação de dados para o Pub/Sub requer a utilização de consultas contínuas do BigQuery.
Este documento descreve como pode configurar a extração, a transformação e o carregamento inversos (RETL) do BigQuery para o Pub/Sub.
Pode fazê-lo usando a declaração EXPORT DATA numa consulta contínua para exportar dados do BigQuery para um tópico do Pub/Sub.
Pode usar um fluxo de trabalho RETL para o Pub/Sub para combinar as capacidades de análise do BigQuery com o serviço de mensagens global assíncrono e escalável do Pub/Sub. Este fluxo de trabalho permite-lhe fornecer dados a aplicações e serviços a jusante de forma orientada por eventos.
Pré-requisitos
Tem de criar uma conta de serviço. É necessária uma conta de serviço para executar uma consulta contínua que exporte resultados para um tópico do Pub/Sub.
Tem de criar um tópico do Pub/Sub para receber os resultados da consulta contínua como mensagens e uma subscrição do Pub/Sub que a aplicação de destino possa usar para receber essas mensagens.
Funções necessárias
Esta secção fornece informações sobre as funções e as autorizações necessárias para a conta de utilizador que cria a consulta contínua e a conta de serviço que executa a consulta contínua.
Autorizações da conta de utilizador
Para criar uma tarefa no BigQuery, a conta de utilizador tem de ter a autorização de IAM bigquery.jobs.create. Cada uma das seguintes funções do IAM concede a autorização bigquery.jobs.create:
- Utilizador do BigQuery (
roles/bigquery.user) - Utilizador de tarefas do BigQuery (
roles/bigquery.jobUser) - Administrador do BigQuery (
roles/bigquery.admin)
Para enviar uma tarefa que é executada através de uma conta de serviço, a conta de utilizador tem de ter a função
Utilizador da conta de serviço (roles/iam.serviceAccountUser). Se estiver a usar a mesma conta de utilizador para criar a conta de serviço,
a conta de utilizador tem de ter a função
Administrador da conta de serviço (roles/iam.serviceAccountAdmin). Para obter informações sobre como limitar o acesso de um utilizador a uma única conta de serviço, em vez de a todas as contas de serviço num projeto, consulte o artigo Conceda uma única função.
Se a conta de utilizador tiver de ativar as APIs necessárias para o seu exemplo de utilização de consulta contínua, a conta de utilizador tem de ter a função Administrador de utilização de serviços (roles/serviceusage.serviceUsageAdmin).
Autorizações da conta de serviço
Para exportar dados de uma tabela do BigQuery, a conta de serviço tem de ter a autorização de IAM bigquery.tables.export. Cada uma das seguintes funções de IAM concede a autorização bigquery.tables.export:
- Visualizador de dados do BigQuery (
roles/bigquery.dataViewer) - Editor de dados do BigQuery (
roles/bigquery.dataEditor) - Proprietário dos dados do BigQuery (
roles/bigquery.dataOwner) - Administrador do BigQuery (
roles/bigquery.admin)
Para que a conta de serviço aceda ao Pub/Sub, tem de conceder à conta de serviço as seguintes funções do IAM:
Também pode conseguir as autorizações necessárias através de funções personalizadas.
Antes de começar
Enable the BigQuery and Pub/Sub APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM
role (roles/serviceusage.serviceUsageAdmin), which
contains the serviceusage.services.enable permission. Learn how to grant
roles.
Exporte para o Pub/Sub
Use a declaração
EXPORT DATA
para exportar dados para um tópico do Pub/Sub:
Consola
Na Google Cloud consola, aceda à página BigQuery.
No editor de consultas, clique em Mais > Definições da consulta.
Na secção Consulta contínua, selecione a caixa de verificação Usar modo de consulta contínua.
Na caixa Conta de serviço, selecione a conta de serviço que criou.
Clique em Guardar.
No editor de consultas, introduza a seguinte declaração:
EXPORT DATA OPTIONS ( format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID' ) AS ( QUERY );
Substitua o seguinte:
PROJECT_ID: o ID do seu projeto.TOPIC_ID: o ID do tópico do Pub/Sub. Pode obter o ID do tópico na página Tópicos da consola Google Cloud .QUERY: a declaração SQL para selecionar os dados a exportar. A declaração SQL só pode conter operações suportadas. Tem de usar a funçãoAPPENDSna cláusulaFROMde uma consulta contínua para especificar o momento em que deve começar a processar dados.
Clique em Executar.
bq
-
In the Google Cloud console, activate Cloud Shell.
Na linha de comandos, execute a consulta contínua através do comando
bq querycom os seguintes sinalizadores:- Defina o sinalizador
--continuouscomotruepara tornar a consulta contínua. - Use a flag
--connection_propertypara especificar uma conta de serviço a usar.
bq query --project_id=PROJECT_ID --use_legacy_sql=false \ --continuous=true --connection_property=service_account=SERVICE_ACCOUNT_EMAIL \ 'EXPORT DATA OPTIONS (format = "CLOUD_PUBSUB", uri = "https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID") AS (QUERY);'
Substitua o seguinte:
PROJECT_ID: o ID do seu projeto.SERVICE_ACCOUNT_EMAIL: o email da conta de serviço. Pode obter o email da conta de serviço na página Contas de serviço da Google Cloud consola.QUERY: a declaração SQL para selecionar os dados a exportar. A declaração SQL só pode conter operações suportadas. Tem de usar a funçãoAPPENDSna cláusulaFROMde uma consulta contínua para especificar o momento em que deve começar a processar dados.
- Defina o sinalizador
Execute a consulta contínua chamando o método
jobs.insert. Defina os seguintes campos no recursoJobConfigurationQuerydo recursoJobque transmite:- Defina o campo
continuouscomotruepara tornar a consulta contínua. - Use o campo
connection_propertypara especificar uma conta de serviço a usar.
curl --request POST \ 'https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/jobs' --header 'Authorization: Bearer $(gcloud auth print-access-token) \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data '("configuration":("query":"EXPORT DATA OPTIONS (format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID') AS (QUERY);","useLegacySql":false,"continuous":true,"connectionProperties":["key": "service_account","value":"SERVICE_ACCOUNT_EMAIL"]))' \ --compressed
Substitua o seguinte:
PROJECT_ID: o ID do seu projeto.QUERY: a declaração SQL para selecionar os dados a exportar. A declaração SQL só pode conter operações suportadas. Tem de usar a funçãoAPPENDSna cláusulaFROMde uma consulta contínua para especificar o momento em que deve começar a processar dados.SERVICE_ACCOUNT_EMAIL: o email da conta de serviço. Pode obter o email da conta de serviço na página Contas de serviço da Google Cloud consola.
- Defina o campo
API
Exporte várias colunas para o Pub/Sub
Se quiser incluir várias colunas no resultado, pode criar uma coluna struct para conter os valores das colunas e, em seguida, converter o valor struct numa string JSON através da função TO_JSON_STRING.
O exemplo seguinte exporta dados de quatro colunas, formatados como uma string JSON:
EXPORT DATA OPTIONS ( format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/myproject/topics/taxi-real-time-rides') AS ( SELECT TO_JSON_STRING( STRUCT( ride_id, timestamp, latitude, longitude)) AS message FROM APPENDS(TABLE `myproject.real_time_taxi_streaming.taxi_rides`, -- Configure the APPENDS TVF start_timestamp to specify when you want to -- start processing data using your continuous query. -- This example starts processing at 10 minutes before the current time. CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) WHERE ride_status = 'enroute' );
Otimização da exportação
Se o desempenho da tarefa de consulta contínua parecer estar limitado pelos
recursos de computação disponíveis,
experimente aumentar o tamanho da
CONTINUOUS atribuição de reserva de slots do BigQuery.
Limitações
- Os dados exportados têm de consistir numa única coluna
STRINGouBYTES. O nome da coluna fica ao seu critério. - Tem de usar uma consulta contínua para exportar para o Pub/Sub.
- Não pode transmitir um esquema a um tópico do Pub/Sub na consulta contínua.
- Não pode exportar dados para um tópico do Pub/Sub que use um esquema.
- Quando exporta para o Pub/Sub, pode exportar registos formatados em JSON
em que alguns valores são
NULL, mas não pode exportar registos que consistam apenas em valoresNULL. Pode excluir registosNULLdos resultados da consulta incluindo um filtroWHERE message IS NOT NULLna consulta contínua. - Quando exporta dados para um tópico do Pub/Sub configurado com um ponto final de localização, o ponto final tem de ser configurado dentro do mesmo limite Google Cloud regional que o conjunto de dados do BigQuery que contém a tabela que está a consultar.
- Os dados exportados não podem exceder as quotas do Pub/Sub.
Preços
Quando exporta dados numa consulta contínua, a faturação é feita através dos
preços de computação de capacidade do BigQuery.
Para executar consultas contínuas, tem de ter uma reserva que use a edição Enterprise ou Enterprise Plus e uma atribuição de reserva que use o tipo de tarefa CONTINUOUS.
Após a exportação dos dados, é-lhe cobrado o uso do Pub/Sub. Para mais informações, consulte os preços do Pub/Sub.