1. Introdução
Neste codelab, você vai aprender a usar o Spanner Data Boost (em inglês) para consultar dados do Spanner no BigQuery usando consultas federadas de ETL sem impacto e sem afetar o banco de dados do Spanner.
O Spanner Data Boost é um serviço sem servidor totalmente gerenciado que fornece recursos de computação independentes para cargas de trabalho do Spanner compatíveis. O Data Boost permite executar consultas de análise e exportações de dados com impacto quase zero nas cargas de trabalho atuais na instância provisionada do Spanner usando um modelo de uso sob demanda sem servidor.
Quando combinado com conexões externas do BigQuery, o Data Boost permite consultar facilmente dados do Spanner para sua plataforma de análise de dados sem movimentação complexa de dados de ETL.
Pré-requisitos
- Noções básicas sobre o Google Cloud, console
- Habilidades básicas na interface de linha de comando e no Google Shell
O que você vai aprender
- Como implantar uma instância do Spanner
- Como carregar dados para criar um banco de dados do Spanner
- Como acessar os dados do Spanner pelo BigQuery sem o Data Boost
- Como acessar dados do Spanner pelo BigQuery com o Data Boost
O que é necessário
- Uma conta e um projeto do Google Cloud
- Um navegador da Web, como o Chrome
2. Configuração e requisitos
Configuração de ambiente personalizada
- Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.
- O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google e pode ser atualizada quando você quiser.
- O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como
PROJECT_ID
. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto. - Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
- Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não vai ser muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.
Iniciar o Cloud Shell
Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.
No Console do Google Cloud, clique no ícone do Cloud Shell na barra de ferramentas superior à direita:
O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:
Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Neste codelab, todo o trabalho pode ser feito com um navegador. Você não precisa instalar nada.
3. Criar uma instância e um banco de dados do Spanner
Ativar a API Spanner
No Cloud Shell, verifique se o ID do projeto está configurado:
gcloud config set project [YOUR-PROJECT-ID]
PROJECT_ID=$(gcloud config get-value project)
Configure sua região padrão como us-central1
. Se quiser, mude para outra região compatível com as configurações regionais do Spanner.
gcloud config set compute/region us-central1
Ative a API Spanner:
gcloud services enable spanner.googleapis.com
Criar a instância do Spanner
Nesta etapa, vamos configurar a instância do Spanner para o codelab. Para fazer isso, abra o Cloud Shell e execute este comando:
export SPANNER_INSTANCE_ID=codelab-demo
export SPANNER_REGION=regional-us-central1
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=$SPANNER_REGION \
--description="Spanner Codelab instance" \
--nodes=1
Resposta ao comando:
$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=$SPANNER_REGION \
--description="Spanner Codelab instance" \
--nodes=1
Creating instance...done.
Crie o banco de dados
Quando sua instância estiver em execução, você poderá criar o banco de dados. O Spanner permite vários bancos de dados em uma única instância.
O banco de dados é onde você define o esquema. Você também pode controlar quem tem acesso ao banco de dados, definir criptografia personalizada, configurar o otimizador e definir o período de armazenamento.
Para criar o banco de dados, use novamente a ferramenta de linha de comando gcloud:
export SPANNER_DATABASE=codelab-db
gcloud spanner databases create $SPANNER_DATABASE \
--instance=$SPANNER_INSTANCE_ID
Resposta ao comando:
$ gcloud spanner databases create $SPANNER_DATABASE \
--instance=$SPANNER_INSTANCE_ID
Creating database...done.
4. Carregar dados
Antes de usar o Data Boost, você precisa ter alguns dados no banco de dados. Para isso, crie um bucket do Cloud Storage, faça upload de uma importação do Avro no bucket e inicie um job de importação do Dataflow para carregar os dados do Avro no Spanner.
Ativar APIs
Para fazer isso, abra um comando do Cloud Shell caso o comando anterior tenha sido fechado.
Ative as APIs Compute, Cloud Storage e Dataflow.
gcloud services enable compute.googleapis.com storage.googleapis.com dataflow.googleapis.com
Saída esperada do console:
$ gcloud services enable compute.googleapis.com storage.googleapis.com dataflow.googleapis.com
Operation "operations/acat.*snip*" finished successfully.
Organizar os arquivos de importação no Cloud Storage
Agora crie o bucket para armazenar os arquivos Avro:
export GCS_BUCKET=spanner-codelab-import_$(date '+%Y-%m-%d_%H_%M_%S')
gcloud storage buckets create gs://$GCS_BUCKET
Saída esperada do console:
$ gcloud storage buckets create gs://$GCS_BUCKET
Creating gs://spanner-codelab-import/...
Em seguida, faça o download do arquivo .tar do github e extraia-o.
wget https://github.com/dtest/spanner-databoost-tutorial/releases/download/v0.1/spanner-chat-db.tar.gz
tar -xzvf spanner-chat-db.tar.gz
Saída esperada do console:
$ wget https://github.com/dtest/spanner-databoost-tutorial/releases/download/v0.1/spanner-chat-db.tar.gz
*snip*
*snip*(123 MB/s) - ‘spanner-chat-db.tar.gz' saved [46941709/46941709]
$
$ tar -xzvf spanner-chat-db.tar.gz
spanner-chat-db/
spanner-chat-db/users.avro-00000-of-00002
spanner-chat-db/user_notifications-manifest.json
spanner-chat-db/interests-manifest.json
spanner-chat-db/users-manifest.json
spanner-chat-db/users.avro-00001-of-00002
spanner-chat-db/topics-manifest.json
spanner-chat-db/topics.avro-00000-of-00002
spanner-chat-db/topics.avro-00001-of-00002
spanner-chat-db/user_interests-manifest.json
spanner-chat-db/spanner-export.json
spanner-chat-db/interests.avro-00000-of-00001
spanner-chat-db/user_notifications.avro-00000-of-00001
spanner-chat-db/user_interests.avro-00000-of-00001
Agora faça upload dos arquivos para o bucket que você criou.
gcloud storage cp spanner-chat-db gs://$GCS_BUCKET --recursive
Saída esperada do console:
$ gcloud storage cp spanner-chat-db gs://$GCS_BUCKET --recursive
Copying file://spanner-chat-db/users.avro-00000-of-00002 to gs://spanner-codelab-import/spanner-chat-db/users.avro-00000-of-00002
Copying file://spanner-chat-db/user_notifications-manifest.json to gs://spanner-codelab-import/spanner-chat-db/user_notifications-manifest.json
Copying file://spanner-chat-db/interests-manifest.json to gs://spanner-codelab-import/spanner-chat-db/interests-manifest.json
Copying file://spanner-chat-db/users-manifest.json to gs://spanner-codelab-import/spanner-chat-db/users-manifest.json
Copying file://spanner-chat-db/users.avro-00001-of-00002 to gs://spanner-codelab-import/spanner-chat-db/users.avro-00001-of-00002
Copying file://spanner-chat-db/topics-manifest.json to gs://spanner-codelab-import/spanner-chat-db/topics-manifest.json
Copying file://spanner-chat-db/topics.avro-00000-of-00002 to gs://spanner-codelab-import/spanner-chat-db/topics.avro-00000-of-00002
Copying file://spanner-chat-db/topics.avro-00001-of-00002 to gs://spanner-codelab-import/spanner-chat-db/topics.avro-00001-of-00002
Copying file://spanner-chat-db/user_interests-manifest.json to gs://spanner-codelab-import/spanner-chat-db/user_interests-manifest.json
Copying file://spanner-chat-db/spanner-export.json to gs://spanner-codelab-import/spanner-chat-db/spanner-export.json
Copying file://spanner-chat-db/interests.avro-00000-of-00001 to gs://spanner-codelab-import/spanner-chat-db/interests.avro-00000-of-00001
Copying file://spanner-chat-db/user_notifications.avro-00000-of-00001 to gs://spanner-codelab-import/spanner-chat-db/user_notifications.avro-00000-of-00001
Copying file://spanner-chat-db/user_interests.avro-00000-of-00001 to gs://spanner-codelab-import/spanner-chat-db/user_interests.avro-00000-of-00001
Completed files 13/13 | 54.6MiB/54.6MiB
Average throughput: 46.4MiB/s
Importar dados
Com os arquivos no Cloud Storage, é possível iniciar um job de importação do Dataflow para carregar os dados no Spanner.
gcloud dataflow jobs run import_chatdb \
--gcs-location gs://dataflow-templates-us-central1/latest/GCS_Avro_to_Cloud_Spanner \
--region us-central1 \
--staging-location gs://$GCS_BUCKET/tmp \
--parameters \
instanceId=$SPANNER_INSTANCE_ID,\
databaseId=$SPANNER_DATABASE,\
inputDir=gs://$GCS_BUCKET/spanner-chat-db
Saída esperada do console:
$ gcloud dataflow jobs run import_chatdb \
> --gcs-location gs://dataflow-templates-us-central1/latest/GCS_Avro_to_Cloud_Spanner \
> --region us-central1 \
> --staging-location gs://$GCS_BUCKET/tmp \
> --parameters \
> instanceId=$SPANNER_INSTANCE_ID,\
> databaseId=$SPANNER_DATABASE,\
> inputDir=gs://$GCS_BUCKET/spanner-chat-db
createTime: '*snip*'
currentStateTime: '*snip*'
id: *snip*
location: us-central1
name: import_chatdb
projectId: *snip*
startTime: '*snip*'
type: JOB_TYPE_BATCH
Verifique o status do job de importação com este comando.
gcloud dataflow jobs list --filter="name=import_chatdb" --region us-central1
Saída esperada do console:
$ gcloud dataflow jobs list --filter="name=import_chatdb"
`--region` not set; getting jobs from all available regions. Some jobs may be missing in the event of an outage. https://cloud.google.com/dataflow/docs/concepts/regional-endpoints
JOB_ID NAME TYPE CREATION_TIME STATE REGION
*snip* import_chatdb Batch 2024-04-*snip* Done us-central1
Verificar dados no Spanner
Agora acesse o Spanner Studio e verifique se os dados estão lá. Primeiro, expanda a tabela de tópicos para visualizar as colunas.
Agora execute a seguinte consulta para garantir que os dados estejam disponíveis:
SELECT COUNT(*) FROM topics;
Saída esperada:
5. Ler dados do BigQuery
Agora que os dados estão no Spanner, é hora de acessá-los no BigQuery. Para isso, configure uma conexão externa com o Spanner no BigQuery.
Supondo que você tenha as permissões corretas, crie uma conexão externa com o Spanner seguindo as etapas abaixo.
Clique no botão "Adicionar" na parte superior do console do BigQuery e selecione "Conexões com fontes de dados permanentes". é a melhor opção.
Agora é possível executar uma consulta para ler dados do Spanner. Execute esta consulta no console do BigQuery, substituindo o valor pelo seu ${PROJECT_ID}:
SELECT *
FROM (
SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_no-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted")
)
ORDER BY num_topics DESC;
Exemplo de saída:
É possível ver informações sobre o job, como quanto tempo levou para ser executado e a quantidade de dados processados na seção "Informações do job" .
Em seguida, você vai adicionar uma conexão do Data Boost ao Spanner e comparar os resultados.
6. Ler dados usando o Data Boost
Para usar o Spanner Data Boost, você precisa criar uma nova conexão externa do BigQuery com o Spanner. Clique em "Adicionar" no console do BigQuery e selecione "Connections from external data sources
" de novo.
Preencha os detalhes com o mesmo URI de conexão no Spanner. Mudar o "ID da conexão" e marque a opção "Usar otimização de dados" caixa
Depois de criar a conexão do Data Boost, é possível executar a mesma consulta, mas com o novo nome da conexão. Novamente, substitua o project_id na consulta.
SELECT *
FROM (
SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_use-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted")
)
ORDER BY num_topics DESC;
Você deve obter o mesmo conjunto de resultados de antes. Os horários mudaram?
7. Noções básicas sobre o Data Boost
O Spanner Data Boost permite usar recursos não relacionados aos recursos da sua instância do Spanner. Isso reduz principalmente o impacto das cargas de trabalho analíticas nas cargas de trabalho operacionais.
Isso pode ser observado se você executar a consulta para não usar o Data Boost algumas vezes em dois ou três minutos. Lembre-se de substituir ${PROJECT_ID}
.
SELECT *
FROM (
SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_no-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted")
)
ORDER BY num_topics DESC;
Em seguida, aguarde mais alguns minutos e execute a consulta para usar o Data Boost mais algumas vezes. Lembre-se de substituir ${PROJECT_ID}
.
SELECT *
FROM (
SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_use-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted")
)
ORDER BY num_topics DESC;
Agora volte ao Spanner Studio no console do Cloud e acesse "Insights do sistema"
Aqui, você encontra as métricas da CPU. As consultas executadas sem o Data Boost estão usando CPU para "executesql_select_withpartitiontoken" as operações. Embora a consulta seja a mesma, a execução do Data Boost não aparece na utilização da CPU da sua instância.
Em muitos casos, o desempenho da consulta analítica vai melhorar com o uso do Data Boost. O conjunto de dados deste tutorial é pequeno, e não há outras cargas de trabalho competindo por recursos. Portanto, não esperamos mostrar melhorias de desempenho neste tutorial.
Fique à vontade para testar consultas e cargas de trabalho e ver como o Data Boost funciona. Quando terminar, avance para a próxima seção para limpar o ambiente.
8. Limpar o ambiente
Se você criou seu projeto especificamente para este codelab, basta excluí-lo para limpá-lo. Se você quiser manter o projeto e limpar os componentes individuais, prossiga com as etapas a seguir.
Remover conexões do BigQuery
Para remover as duas conexões, clique nos três pontos ao lado do nome da conexão. Selecione "Excluir" e siga as instruções para excluir a conexão.
Excluir o bucket do Cloud Storage
gcloud storage rm --recursive gs://$GCS_BUCKET
Excluir instância do Spanner
Para fazer a limpeza, acesse a seção Cloud Spanner do console do Cloud e exclua o "codelab-demo
" que criamos no codelab.
9. Parabéns
Parabéns por concluir o codelab.
O que aprendemos
- Como implantar uma instância do Spanner
- Como carregar dados no Spanner usando o Dataflow
- Como acessar dados do Spanner pelo BigQuery
- Como usar o Data Boost do Spanner para evitar impactos na instância do Spanner para consultas analíticas do BigQuery
10. Pesquisa
Saída: