Importar dados de bancos de dados que não são do Spanner

Nesta página, descrevemos como preparar arquivos Avro que você exportou de bancos de dados que não são do Spanner e importar esses arquivos para o Spanner. Se quiser importar um banco de dados do Spanner que já foi exportado, consulte Importar arquivos Avro do Spanner.

O processo usa o Dataflow. Ele importa dados de um bucket do Cloud Storage que contém um conjunto de arquivos Avro e um arquivo de manifesto JSON que especifica as tabelas de destino e os arquivos Avro que preenchem cada tabela.

Antes de começar

Para importar um banco de dados do Spanner, primeiro você precisa ativar as APIs Spanner, Cloud Storage, Compute Engine e Dataflow:

Ative as APIs

É preciso também ter cota suficiente e as permissões obrigatórias do IAM.

Requisitos de cota

Os requisitos de cota para jobs de importação são os seguintes:

  • Spanner: é necessário ter capacidade de computação suficiente para a quantidade de dados que você está importando. Nenhuma capacidade de computação extra é necessária para importar um banco de dados, mas talvez seja necessário adicionar mais capacidade de computação para que o job seja concluído em um período razoável. Veja Otimizar tarefas para mais detalhes.
  • Cloud Storage: para importar, é preciso ter um bucket contendo os arquivos exportados anteriormente. Não é necessário definir um tamanho para o bucket.
  • Dataflow: os jobs de importação estão sujeitos às mesmas cotas do Compute Engine para endereço IP, uso da CPU e do disco aplicadas a outros jobs do Dataflow.
  • Compute Engine: antes de executar um job de importação, é necessário configurar cotas iniciais para o Compute Engine, que serão usadas pelo Dataflow. Essas cotas representam o número máximo de recursos que você permite que o Dataflow use para seu job. Os valores iniciais recomendados são:

    • CPUs: 200
    • Endereços IP em uso: 200
    • Disco permanente padrão: 50 TB

    Em geral, não é necessário fazer nenhum outro ajuste. O Dataflow fornece escalonamento automático para que você pague apenas pelos recursos efetivamente utilizados durante a importação. Se seu job puder usar mais recursos, a IU do Dataflow exibirá um ícone de aviso. O job será concluído, mesmo que um ícone de aviso seja exibido.

Requisitos do IAM

Para importar um banco de dados, é preciso também ter papéis do IAM com permissões suficientes para usar todos os serviços envolvidos em um job de importação. Para informações sobre como conceder papéis e permissões, consulte Aplicar papéis do IAM.

Para importar um banco de dados, você precisa dos seguintes papéis:

Exportar dados de um banco de dados que não seja o Spanner para arquivos Avro

O processo de importação traz dados de arquivos Avro localizados em um bucket do Cloud Storage. É possível exportar dados no formato Avro de qualquer fonte e usar qualquer método disponível para fazer isso.

Para exportar dados de um banco de dados que não seja do Spanner para arquivos Avro, siga estas etapas:

Tenha isto em mente ao exportar seus dados:

  • É possível exportar usando qualquer um dos tipos primitivos do Avro, bem como o tipo complexo de matriz.
  • Cada coluna nos seus arquivos Avro precisa usar um dos seguintes tipos de colunas:

    • ARRAY
    • BOOL
    • BYTES*
    • DOUBLE
    • FLOAT
    • INT
    • LONG
    • STRING

    * Uma coluna do tipo BYTES é usada para importar um NUMERIC do Spanner. Consulte os mapeamentos recomendados abaixo para conferir mais detalhes.

    †,‡ É possível importar um LONG armazenando um carimbo de data/hora ou um STRING armazenando um carimbo de data/hora como um TIMESTAMP do Spanner. Consulte os mapeamentos recomendados abaixo para mais detalhes.

  • Não é necessário incluir ou gerar metadados ao exportar os arquivos Avro.

  • Não é necessário seguir nenhuma convenção de nomenclatura específica para seus arquivos.

Se você não exportar seus arquivos diretamente para o Cloud Storage, é necessário fazer o upload dos arquivos Avro para um bucket do Cloud Storage. Para instruções detalhadas, consulte Fazer upload de objetos no Cloud Storage.

Importar arquivos Avro de bancos de dados que não são do Spanner para o Spanner

Para importar arquivos Avro de um banco de dados que não seja do Spanner para o Spanner, siga estas etapas:

  1. Criar tabelas de destino e definir o esquema para o banco de dados do Spanner.
  2. Crie um arquivo spanner-export.json no bucket do Cloud Storage.
  3. Executar um job de importação do Dataflow usando a CLI gcloud.

Etapa 1: criar o esquema para o banco de dados do Spanner

Antes de executar sua importação, você precisa criar a tabela de destino no Spanner e definir o esquema.

É necessário criar um esquema que use o tipo de coluna apropriado para cada coluna nos arquivos Avro.

GoogleSQL

Tipo de coluna Avro Tipo de coluna do Spanner
ARRAY ARRAY
BOOL BOOL
BYTES

BYTES

NUMERIC (quando o tipo de coluna é BYTES e logicalType=decimal, precision=38 e scale=9. Se essas especificações exatas forem omitidas, o campo será tratado como um valor BYTES do Spanner. Para mais informações, consulte a documentação sobre o tipo lógico decimal Avro.

DOUBLE FLOAT64
FLOAT FLOAT64
INT INT64
LONG

INT64

TIMESTAMP quando LONG representa um carimbo de data/hora do número de microssegundos desde 1970-01-01 00:00:00 UTC

STRING

STRING

TIMESTAMP quando STRING representa um carimbo de data/hora no formato canônico para consultas SQL

PostgreSQL

Tipo de coluna Avro Tipo de coluna do Spanner
ARRAY ARRAY
BOOL BOOLEAN
BYTES

BYTEA

NUMERIC (quando o tipo de coluna é BYTEA e logicalType=decimal, precision=147455 e scale=16383. Se essas especificações exatas forem omitidas, o campo será tratado como um valor BYTEA. Para mais informações, consulte a documentação sobre o tipo lógico decimal Avro.

DOUBLE DOUBLE PRECISION
FLOAT DOUBLE PRECISION
INT BIGINT
LONG

BIGINT

TIMESTAMP quando LONG representa um carimbo de data/hora do número de microssegundos desde 1970-01-01 00:00:00 UTC

STRING

CHARACTER VARYING

TIMESTAMP quando STRING representa um carimbo de data/hora no formato canônico para consultas SQL, por exemplo "2022-05-28T07:08:21.123456789Z" ou "2021-12-19T16:39:57-08:00".

Etapa 2: criar um arquivo spanner-export.json

Também é possível criar um arquivo chamado spanner-export.json no bucket do Cloud Storage. Esse arquivo especifica o dialeto do banco de dados e contém uma matriz tables que lista o nome e os locais dos arquivos de dados para cada tabela.

Os conteúdos do arquivo têm o seguinte formato:

{
  "tables": [
   {
    "name": "TABLE1",
    "dataFiles": [
      "RELATIVE/PATH/TO/TABLE1_FILE1",
      "RELATIVE/PATH/TO/TABLE1_FILE2"
    ]
   },
   {
    "name": "TABLE2",
    "dataFiles": ["RELATIVE/PATH/TO/TABLE2_FILE1"]
   }
  ],
  "dialect":"DATABASE_DIALECT"
}

Em que DATABASE_DIALECT = {GOOGLE_STANDARD_SQL | POSTGRESQL}

Se o elemento de dialeto for omitido, o dialeto será GOOGLE_STANDARD_SQL por padrão.

Etapa 3: executar um job de importação do Dataflow usando a CLI gcloud

Para iniciar o job de importação, siga as instruções sobre como usar a Google Cloud CLI para executar um job com o modelo Avro para Spanner.

Depois de iniciar um job de importação, é possível ver detalhes sobre o job no console do Google Cloud.

Após a conclusão do job de importação, adicione as chaves estrangeiras e os índices secundários necessários.

Escolha uma região para seu job de importação

Convém escolher uma região diferente com base na localização do seu bucket do Cloud Storage. Para evitar cobranças de transferência de dados de saída, escolha uma região que corresponda à localização do seu bucket do Cloud Storage.

  • Se o local do bucket do Cloud Storage for uma região, aproveite o uso de rede gratuito escolhendo a mesma região para o job de importação, supondo que ela esteja disponível.

  • Se o local do bucket do Cloud Storage for um local birregional, você poderá aproveitar o uso de rede gratuito escolhendo uma das duas regiões que compõem a região birregional do job de importação, supondo que uma delas esteja disponível.

  • Se uma região colocalizada não estiver disponível para o job de importação ou se o local do bucket do Cloud Storage for multirregional, serão aplicadas as taxas de transferência de dados de saída. Consulte os preços de transferência de dados do Cloud Storage para escolher uma região que gere as menores cobranças de transferência de dados.

Confira ou resolva problemas de jobs na IU do Dataflow

Depois de iniciar um job de importação, é possível visualizar detalhes dele, incluindo registros, na seção Dataflow do console do Google Cloud.

Mais detalhes do job do Dataflow

Para ver os detalhes de qualquer job de importação/exportação executado na última semana, incluindo os jobs em execução no momento:

  1. Navegue até a página Detalhes do banco de dados.
  2. Clique no item de menu do painel esquerdo Importar/Exportar. A página Importar/Exportar do banco de dados exibe uma lista de jobs recentes.
  3. Na página Importar/Exportar do banco de dados, clique no nome do job na coluna Nome do job do Dataflow:

    Mensagem de status do job em andamento

    O console do Google Cloud exibe detalhes do job do Dataflow.

Para visualizar um job executado há mais de uma semana, siga estas etapas:

  1. Acesse a página "Jobs" do Dataflow no console do Google Cloud.

    Ir para a página de jobs

  2. Encontre seu job na lista e clique no nome dele.

    O console do Google Cloud exibe detalhes do job do Dataflow.

Conferir os registros do Dataflow para o job

Para visualizar os registros de um job do Dataflow, navegue até a página de detalhes do job, conforme descrito acima. Em seguida, clique em Registros, à direita do nome do job.

Se um job falhar, procure erros nos registros. Se houver erros, a contagem de erros será exibida ao lado de Registros:

Exemplo de contagem de erros ao lado do botão Registros

Para ver os erros do job, siga estas etapas:

  1. Clique na contagem de erros, ao lado de Registros.

    O console do Google Cloud exibe os registros do job. Pode ser necessário rolar para visualizar os erros.

  2. Localize entradas com o ícone de erro Ícone de erro.

  3. Clique em uma entrada de registro individual para expandir seu conteúdo.

Para mais informações sobre como solucionar problemas de jobs do Dataflow, consulte Resolver problemas do pipeline.

Resolver problemas de jobs de importação com falha

Se você vir os seguintes erros nos registros do job:

com.google.cloud.spanner.SpannerException: NOT_FOUND: Session not found

--or--

com.google.cloud.spanner.SpannerException: DEADLINE_EXCEEDED: Deadline expired before operation could complete.

Verifique a latência de gravação de 99% na guia Monitoramento do banco de dados do Spanner no console do Google Cloud. Se estiver exibindo valores altos (vários segundos), isso indicará que a instância está sobrecarregada, fazendo com que as gravações expirem e falhem.

Uma das causas de alta latência é a execução do job do Dataflow com muitos workers, o que sobrecarrega a instância do Spanner.

Para especificar um limite no número de workers do Dataflow, em vez de usar a guia "Importar/Exportar" na página de detalhes da instância do banco de dados do Spanner no console do Google Cloud, inicie a importação usando o modelo Avro do Cloud Storage para Cloud Spanner e especifique o número máximo de workers conforme descrito abaixo:
  • Se você estiver usando o console do Dataflow, o parâmetro Workers máximos estará localizado na seção Parâmetros opcionais da página Criar job a partir do modelo.

  • Se você estiver usando o gcloud, especifique o argumento max-workers. Exemplo:

    gcloud dataflow jobs run my-import-job \
    --gcs-location='gs://dataflow-templates/latest/GCS_Avro_to_Cloud_Spanner' \
    --region=us-central1 \
    --parameters='instanceId=test-instance,databaseId=example-db,inputDir=gs://my-gcs-bucket' \
    --max-workers=10
    

Otimizar jobs de importação com execução lenta

Se as sugestões das configurações iniciais forem seguidas, geralmente não será necessário fazer nenhum outro ajuste. Se o job estiver sendo executado lentamente, é possível tentar outras otimizações:

  • Otimize o local do job e dos dados: execute o job do Dataflow na mesma região em que estão localizados a instância do Spanner e o bucket do Cloud Storage.

  • Garanta recursos suficientes do Dataflow: se as cotas relevantes do Compute Engine limitarem os recursos do job do Dataflow, a página do Dataflow do job no console do Google Cloud exibirá um ícone de aviso Ícone de aviso e mensagens de registro:

    Captura de tela do aviso de limite de cota

    Nessa situação, é possível reduzir o ambiente de execução do job aumentando as cotas (em inglês) para CPUs, endereços IP em uso e disco permanente padrão. Porém, isso pode resultar em mais cobranças do Compute Engine.

  • Verifique a utilização da CPU do Spanner: se você perceber que a utilização da CPU para a instância é superior a 65%, aumente a capacidade de computação dessa instância. A capacidade adiciona mais recursos do Spanner e o job deve acelerar, mas isso gera mais cobranças.

Fatores que afetam o desempenho do job de importação

Vários fatores influenciam o tempo necessário para concluir um job de importação.

  • Tamanho do banco de dados do Spanner: o processamento de mais dados leva mais tempo e exige mais recursos.

  • Esquema do banco de dados do Spanner, incluindo:

    • O número de tabelas
    • o tamanho das linhas
    • O número de índices secundários
    • O número de chaves estrangeiras
    • O número de fluxo de alterações

  • Localização dos dados: os dados são transferidos entre o Spanner e o Cloud Storage usando o Dataflow. O ideal é que os três componentes estejam localizados na mesma região. Se não estiverem, a movimentação dos dados pelas regiões prejudica a velocidade de execução do job.

  • Número de workers do Dataflow: o número ideal de workers do Dataflow é necessário para um bom desempenho. Ao usar o escalonamento automático, o Dataflow escolhe o número de workers para o job, dependendo da quantidade de trabalho que precisa ser feita. O número de workers, no entanto, será limitado pelas cotas para CPUs, endereços IP em uso e disco permanente padrão. A IU do Dataflow exibirá um ícone de aviso caso encontre limites de cotas. Nessa situação, o progresso será mais lento, mas ainda assim o job será concluído. O escalonamento automático pode sobrecarregar o Spanner, o que leva a erros quando há uma grande quantidade de dados para importar.

  • Carga existente no Spanner: um job de importação adiciona carga significativa da CPU em uma instância do Spanner. Se a instância já tiver uma carga atual substancial, a execução do job será mais lenta.

  • Quantidade de capacidade de computação do Spanner: se a utilização da CPU para a instância for superior a 65%, o job será executado mais lentamente.

Ajustar workers para um bom desempenho de importação

Ao iniciar um job de importação do Spanner, os workers do Dataflow precisam ser configurados com um valor ideal para um bom desempenho. Muitos workers sobrecarregam o Spanner e poucos workers resultam em um desempenho de importação desagradável.

O número máximo de workers depende muito do tamanho dos dados, mas o ideal é que a utilização total da CPU do Spanner seja entre 70% e 90%. Isso oferece um bom equilíbrio entre a eficiência do Spanner e a conclusão de jobs sem erros.

Para alcançar essa meta de utilização na maioria dos esquemas e cenários, recomendamos um número máximo de vCPUs de worker entre quatro e seis vezes o número de nós do Spanner.

Por exemplo, para uma instância de 10 nós do Spanner, usando workers n1-standard-2, você definiria o máximo de workers como 25, totalizando 50 vCPUs.