Transferências do Amazon S3

O serviço de transferência de dados do BigQuery para Amazon S3 permite programar e gerenciar automaticamente jobs de carga recorrentes do Amazon S3 para o BigQuery.

Antes de começar

Antes de criar uma transferência do Amazon S3, siga estas recomendações:

Limitações

As transferências do Amazon S3 estão sujeitas às limitações a seguir:

  • No momento, não é possível parametrizar a parte do bucket do URI do Amazon S3.
  • As transferências do Amazon S3 são sempre acionadas com a preferência WRITE_APPEND, que anexa dados à tabela de destino. Consulte configuration.load.writeDisposition na configuração do job de carregamento para mais detalhes.
  • Dependendo do formato dos dados de origem do Amazon S3, pode haver outras limitações. Veja mais informações aqui:

  • O intervalo de tempo mínimo entre as transferências recorrentes é de 24 horas. O intervalo padrão para uma transferência recorrente é 24 horas.

Permissões necessárias

Antes de criar uma transferência do Amazon S3, siga estas recomendações:

  • Certifique-se de que a pessoa que está criando a transferência tenha as seguintes permissões necessárias no BigQuery:

    • Permissões bigquery.transfers.update para criar a transferência
    • As permissões bigquery.datasets.get e bigquery.datasets.update no conjunto de dados de destino

    O papel predefinido bigquery.admin do IAM inclui permissões bigquery.transfers.update, bigquery.datasets.update e bigquery.datasets.get. Para mais informações sobre os papéis do IAM no serviço de transferência de dados do BigQuery, consulte a Referência de controle de acesso.

  • Consulte a documentação do Amazon S3 para garantir que você tenha configurado as permissões necessárias para ativar a transferência. No mínimo, os dados de origem do Amazon S3 precisam ter a política AmazonS3ReadOnlyAccess (em inglês) gerenciada pela AWS aplicada a eles.

Como configurar uma transferência de dados do Amazon S3

Para criar uma transferência de dados do Amazon S3:

Console

  1. Acesse a página do BigQuery no Console do Cloud.

    Acessar a página do BigQuery

  2. Clique em Transferências.

  3. Clique em Criar uma transferência.

  4. Na página Criar transferência:

    • Na seção Tipo de origem, em Origem, escolha Amazon S3.

      Origem da transferência

    • No campo Nome da configuração de transferência da seção Nome de exibição, insira um nome para a transferência, como My Transfer. Esse nome pode ter qualquer valor que identifique facilmente a transferência, caso seja necessário modificá-la futuramente.

      Nome da transferência

    • Na seção Opções de programação, não altere o valor padrão de Programação (Começar agora). Se preferir, clique em Começar no horário definido.

      • Em Repetições, escolha uma opção para a frequência de execução da transferência. As opções incluem:

        • Diário (padrão)
        • Semanal
        • Mensal
        • Personalizada
        • Sob demanda

        Se você escolher uma opção diferente de "Diário", outras opções estarão disponíveis. Por exemplo, se você escolher "Semanal", aparecerá uma opção para selecionar o dia da semana.

      • Em Data e hora de início, insira a data e a hora para iniciar a transferência. Se você escolher Iniciar agora, essa opção ficará desativada.

        Programação da transferência

    • Na seção Configurações de destino, em Conjunto de dados de destino, escolha o conjunto criado para armazenar seus dados.

      Conjunto de dados da transferência

    • Na seção Detalhes da fonte de dados:

      • Para a Tabela de destino, insira o nome da tabela criada para armazenar os dados no BigQuery. Os nomes de tabelas de destino aceitam parâmetros.
      • Em URI do Amazon S3, insira o URI neste formato: s3://mybucket/myfolder/.... Os URIs também aceitam parâmetros.
      • Para Código da chave de acesso, insira seu código de chave de acesso.
      • Em Chave de acesso secreta, insira sua chave de acesso secreta.
      • Em Formato de arquivo, escolha seu formato de dados: JSON delimitado por nova linha, CSV, Avro, Parquet ou ORC.

        Detalhes da origem do S3

    • Na seção Opções de transferência. Todos os formatos:

      • Em Número de erros permitidos, insira um valor inteiro para o número máximo de registros inválidos que podem ser ignorados.
      • (Opcional) Em Tipos de destino decimal, insira uma lista separada por vírgulas de possíveis tipos de dados SQL em que os valores decimais de origem podem ser convertidos. O tipo de dados SQL selecionado para conversão depende das seguintes condições:
        • O tipo de dados selecionado para a conversão será o primeiro da lista a seguir, compatível com a precisão e a escalonabilidade dos dados de origem, nesta ordem: NUMERIC, BIGNUMERIC e STRING.
        • Se nenhum dos tipos de dados listados for compatível com a precisão e a escala, será selecionado o tipo de dados que aceita o intervalo mais amplo na lista especificada. Se um valor exceder o intervalo compatível durante a leitura dos dados de origem, um erro será gerado.
        • O tipo de dados STRING é compatível com todos os valores de precisão e escala.
        • Se este campo for deixado em branco, o tipo de dados será padronizado como "NUMERIC,STRING" para ORC e "NUMERIC" para os outros formatos de arquivo.
        • Este campo não pode conter tipos de dados duplicados.
        • A ordem dos tipos de dados listados nesse campo é ignorada.

      Opções de transferência em todos os formatos

    • Se você escolheu CSV ou JSON como seu formato de arquivo, na seção JSON, CSV, marque Ignorar valores desconhecidos para aceitar linhas que contenham valores que não correspondam ao esquema. Valores desconhecidos são ignorados. Para arquivos CSV, essa opção ignora valores extras no final de uma linha.

      Ignorar valores desconhecidos

    • Se você escolheu CSV como seu formato de arquivo, na seção CSV, insira outras opções CSV para carregar dados.

      Opções de CSV

    • Opcional: na seção Opções de notificação:

      • Clique no botão para ativar as notificações por e-mail. Quando você ativa essa opção, o administrador de transferência recebe uma notificação por e-mail quando uma execução de transferência falha.
      • Em Selecionar um tópico do Pub/Sub, escolha o nome do seu tópico ou clique em Criar um tópico. Essa opção configura notificações de execução do Pub/Sub da sua transferência.
  5. Clique em Salvar.

bq

Insira o comando bq mk e forneça a sinalização de execução da transferência --transfer_config.

bq mk \
--transfer_config \
--project_id=project_id \
--data_source=data_source \
--display_name=name \
--target_dataset=dataset \
--params='parameters'

Em que:

  • project_id: opcional. É o ID do seu projeto no Google Cloud. Se --project_id não for fornecido para especificar um projeto determinado, o projeto padrão será usado;
  • data_source: obrigatório. É a fonte de dados: amazon_s3;
  • display_name: obrigatório. É o nome de exibição da configuração de transferência. Ele pode ter qualquer valor que identifique facilmente a transferência, caso seja necessário modificá-la no futuro;
  • dataset: obrigatório. O conjunto de dados de destino na configuração da transferência;
  • parameters: obrigatório. São os parâmetros da configuração de transferência criada no formato JSON. Por exemplo: --params='{"param":"param_value"}'. Veja a seguir os parâmetros de uma transferência do Amazon S3:

    • destination_table_name_template: obrigatório. É o nome da tabela de destino.
    • data_path: obrigatório. É o URI do Amazon S3 neste formato:

      s3://mybucket/myfolder/...

      Os URIs também aceitam parâmetros.

    • access_key_id: obrigatório. É o ID da chave de acesso.

    • secret_access_key: obrigatório. É a chave de acesso secreta.

    • file_format: opcional. Indica o tipo de arquivo que você quer transferir: CSV, JSON, AVRO, PARQUET ou ORC. O valor padrão é CSV.

    • max_bad_records: opcional. É o número de registros inválidos permitidos. O padrão é 0.

    • decimal_target_types: opcional. Uma lista separada por vírgulas de possíveis tipos de dados SQL em que os valores decimais de origem podem ser convertidos. Se este campo não for fornecido, o tipo de dados será padronizado como "NUMERIC,STRING" para ORC e "NUMERIC" para os outros formatos de arquivo.

    • ignore_unknown_values: opcional e ignorado se file_format não for JSON ou CSV. Define se valores desconhecidos nos seus dados serão ignorados.

    • field_delimiter: opcional e aplicável somente quando file_format é CSV. É o caractere que separa os campos. O valor padrão é a vírgula.

    • skip_leading_rows: opcional e aplicável somente quando file_format é CSV. Indica o número de linhas de cabeçalho que você não quer importar. O valor padrão é 0.

    • allow_quoted_newlines: opcional e aplicável somente quando file_format é CSV. Indica se novas linhas são permitidas dentro de campos entre aspas.

    • allow_jagged_rows: opcional e aplicável somente quando file_format é CSV. Indica se você aceitará linhas que estão faltando em colunas opcionais. Os valores em falta são preenchidos com NULLs.

Por exemplo, com o comando a seguir, você cria uma transferência do Amazon S3 chamada My Transfer. Nela, são usados o valor s3://mybucket/myfile/*.csv em data_path_template, o conjunto de dados de destino mydataset e o CSV file_format. Este exemplo inclui valores não padrão para os parâmetros opcionais associados ao "file_format" CSV.

A transferência é criada no projeto padrão:

bq mk --transfer_config \
--target_dataset=mydataset \
--display_name='My Transfer' \
--params='{"data_path_template":"s3://mybucket/myfile/*.csv",
"destination_table_name_template":"MyTable",
"file_format":"CSV",
"max_bad_records":"1",
"ignore_unknown_values":"true",
"field_delimiter":"|",
"skip_leading_rows":"1",
"allow_quoted_newlines":"true",
"allow_jagged_rows":"false",
"delete_source_files":"true"}' \
--data_source=amazon_s3

Após executar o comando, você recebe uma mensagem semelhante a esta:

[URL omitted] Please copy and paste the above URL into your web browser and follow the instructions to retrieve an authentication code.

Siga as instruções e cole o código de autenticação na linha de comando.

API

Use o método projects.locations.transferConfigs.create e forneça uma instância do recurso TransferConfig.

Java

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.CreateTransferConfigRequest;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ProjectName;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

// Sample to create amazon s3 transfer config.
public class CreateAmazonS3Transfer {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    String datasetId = "MY_DATASET_ID";
    String tableId = "MY_TABLE_ID";
    // Amazon S3 Bucket Uri with read role permission
    String sourceUri = "s3://your-bucket-name/*";
    String awsAccessKeyId = "MY_AWS_ACCESS_KEY_ID";
    String awsSecretAccessId = "AWS_SECRET_ACCESS_ID";
    String sourceFormat = "CSV";
    String fieldDelimiter = ",";
    String skipLeadingRows = "1";
    Map<String, Value> params = new HashMap<>();
    params.put(
        "destination_table_name_template", Value.newBuilder().setStringValue(tableId).build());
    params.put("data_path", Value.newBuilder().setStringValue(sourceUri).build());
    params.put("access_key_id", Value.newBuilder().setStringValue(awsAccessKeyId).build());
    params.put("secret_access_key", Value.newBuilder().setStringValue(awsSecretAccessId).build());
    params.put("source_format", Value.newBuilder().setStringValue(sourceFormat).build());
    params.put("field_delimiter", Value.newBuilder().setStringValue(fieldDelimiter).build());
    params.put("skip_leading_rows", Value.newBuilder().setStringValue(skipLeadingRows).build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDisplayName("Your Aws S3 Config Name")
            .setDataSourceId("amazon_s3")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    createAmazonS3Transfer(projectId, transferConfig);
  }

  public static void createAmazonS3Transfer(String projectId, TransferConfig transferConfig)
      throws IOException {
    try (DataTransferServiceClient client = DataTransferServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      CreateTransferConfigRequest request =
          CreateTransferConfigRequest.newBuilder()
              .setParent(parent.toString())
              .setTransferConfig(transferConfig)
              .build();
      TransferConfig config = client.createTransferConfig(request);
      System.out.println("Amazon s3 transfer created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("Amazon s3 transfer was not created." + ex.toString());
    }
  }
}

Como consultar dados

Quando os dados são transferidos para o BigQuery, eles são gravados em tabelas particionadas por tempo de processamento. Para mais informações, consulte Introdução às tabelas particionadas.

Use a pseudocoluna _PARTITIONTIME para consultar suas tabelas diretamente em vez de usar visualizações geradas automaticamente. Para mais informações, veja Como consultar tabelas particionadas.

Impacto da correspondência de prefixos e de caracteres curinga

A API Amazon S3 é compatível com a correspondência de prefixos, e não com a de caracteres curinga. Todos os arquivos do Amazon S3 que correspondem a um prefixo são transferidos para o Google Cloud. No entanto, só aqueles que correspondem ao URI do Amazon S3 na configuração de transferência são realmente carregados no BigQuery. Isso pode gerar custos de saída excessivos do Amazon S3 relacionados aos arquivos que são transferidos, mas não são carregados no BigQuery.

Por exemplo, veja este caminho de dados:

s3://bucket/folder/*/subfolder/*.csv

Com esses arquivos no local de origem também estão:

s3://bucket/folder/any/subfolder/file1.csv
s3://bucket/folder/file2.csv

Isso faz com que todos os arquivos do Amazon S3 com o prefixo s3://bucket/folder/ sejam transferidos para o Google Cloud. Nesse exemplo, os itens file1.csv e file2.csv serão transferidos.

No entanto, somente arquivos correspondentes a s3://bucket/folder/*/subfolder/*.csv serão carregados no BigQuery. Nesse exemplo, apenas file1.csv será carregado no BigQuery.

Solução de problemas

Veja a seguir informações sobre erros comuns e as soluções recomendadas.

Erros "PERMISSION_DENIED" do Amazon S3

Erro Ação recomendada
O ID da chave de acesso da AWS fornecido não existe em nossos registros. Verifique se a chave de acesso existe, e se o ID está correto.
A assinatura da solicitação que calculamos não corresponde à assinatura fornecida. Verifique sua chave e método de assinatura. Verifique se a configuração de transferência tem a chave de acesso secreta correspondente correta.
Falha ao receber o local do bucket de origem do S3. Mais detalhes: acesso negado

Falha ao receber o local do bucket de origem do S3. Mais detalhes: HTTP/1.1 403 Forbidden

Mensagem de erro do S3: acesso negado
Verifique se o usuário do IAM da AWS tem permissão para executar o seguinte:
  • listar o bucket do Amazon S3;
  • ver a localização do bucket;
  • ler os objetos no bucket.
O servidor não conseguiu inicializar o upload de objeto. InvalidObjectState: a operação não é válida para a classe de armazenamento do objeto

Falha ao receber o local do bucket de origem do S3. Mais detalhes: todo o acesso a este objeto foi desativado
Restaure todos os objetos arquivados no Amazon Glacier. Objetos no Amazon S3 que são arquivados no Amazon Glacier não ficam acessíveis até que sejam restaurados
Todo acesso a este objeto foi desativado. Confirme se o URI do Amazon S3 na configuração de transferência está correto

Erros de limite de transferência do Amazon S3

Erro Ação recomendada
O número de arquivos na transferência excede o limite de 10.000. Avalie se é possível reduzir o número de caracteres curinga no URI do Amazon S3 a apenas um. Se isso for possível, tente novamente com uma nova configuração de transferência, já que o número máximo de arquivos por execução de transferência será maior.

Avalie se é possível dividir a configuração de transferência em várias, cada uma transferindo uma parte dos dados de origem.
O tamanho dos arquivos na transferência excede o limite de 16.492.674.416.640 bytes. Avalie se é possível dividir a configuração de transferência em várias, cada uma transferindo uma parte dos dados de origem.

Problemas gerais

Erro Ação recomendada
Os arquivos são transferidos do Amazon S3, mas não são carregados no BigQuery. Os registros de transferência podem ter esta aparência:

Transferência de dados do Amazon S3 para o Google Cloud concluída: movido <NNN> objeto(s).
Nenhum arquivo novo encontrado correspondente a <Amazon S3 URI>.
Confirme se o URI do Amazon S3 na configuração de transferência está correto.

Se a configuração de transferência foi feita para carregar todos os arquivos com um prefixo comum, verifique se o URI do Amazon S3 termina com um caractere curinga.
Por exemplo, para carregar todos os arquivos em s3://my-bucket/my-folder/, o URI do Amazon S3 na configuração de transferência precisa ser s3://my-bucket/my-folder/*, e não apenas s3://my-bucket/my-folder/.
Outros problemas Consulte Solução de problemas nas configurações de transferência.

A seguir