Como usar o Cloud Storage com Big Data

O Cloud Storage é um componente essencial para quem armazena e trabalha com Big Data no Google Cloud. Por exemplo:

  • Como carregar dados no BigQuery.

  • Utilização do Dataproc, que instala automaticamente o conector do Cloud Storage compatível com o HDFS, possibilitando o uso de buckets do Cloud Storage em paralelo com o HDFS.

  • Uso de um bucket para guardar arquivos de preparo e dados temporários para pipelines do Dataflow.

No caso do Dataflow, é obrigatório ter um bucket do Cloud Storage. Para o BigQuery e o Dataproc, usar um bucket do Cloud Storage é opcional, mas recomendável.

O gsutil é uma ferramenta de linha de comando que permite trabalhar com buckets e objetos do Cloud Storage de maneira fácil e robusta, principalmente em cenários com muitos dados. Por exemplo, com a gsutil, é possível copiar muitos arquivos em paralelo por meio de um único comando, copiar arquivos grandes com eficiência, calcular somas de verificação nos seus dados e medir o desempenho das tarefas realizadas entre seu computador local e o Cloud Storage.

O foco desta página é o uso da gsutil para realizar tarefas com Big Data. Para uma introdução mais simples à gsutil, consulte Primeiros passos: como usar a ferramenta gsutil. A documentação detalhada de todos os comandos da gsutil está disponível on-line e na ajuda incorporada a que você tem acesso ao executar gsutil help.

Para aproveitar ao máximo os exemplos mostrados nesta página, você precisará ter:

Como copiar muitos arquivos para um bucket

Se você precisa fazer o upload de um grande número de arquivos, use a opção gsutil -m para executar uma operação de cópia em paralelo (de multiprocessamento/com várias linhas de execução). Para copiar subdiretórios de maneira recorrente, use a sinalização -R do comando cp. Por exemplo, para copiar arquivos que incluem subdiretórios de um diretório local chamado top-level-dir para um bucket, use o comando a seguir:

gsutil -m cp -R top-level-dir gs://example-bucket

É possível usar caracteres curinga para corresponder a um conjunto específico de nomes em uma operação. Por exemplo, para copiar somente os arquivos que começam com image:

gsutil -m cp -R top-level-dir/subdir/image* gs://example-bucket

Também é possível remover arquivos usando o mesmo caractere curinga:

gsutil -m rm gs://example-bucket/top-level-dir/subdir/image*

Além de copiar arquivos locais para a nuvem e vice-versa, é possível copiar na nuvem. Por exemplo:

gsutil -m cp gs://example-bucket/top-level-dir/subdir/** gs://example-bucket/top-level-dir/subdir/subdir2

A gsutil detecta automaticamente que você está migrando vários arquivos e os cria em um novo diretório chamado subdir2.

Como sincronizar um diretório local

Para sincronizar um diretório local com um bucket e vice-versa, use o comando gsutil rsync. Por exemplo, para fazer com que gs://example-bucket corresponda aos conteúdos do diretório local local-dir, use o comando:

gsutil -m rsync -r local-dir gs://example-bucket

Se você usar a sinalização rsync -d, ela instruirá a gsutil para que exclua arquivos no destino (gs://example-bucket no comando acima) que não estão presentes na origem (local-dir). Também é possível sincronizar dois buckets.

Como copiar arquivos grandes para um bucket

Em geral, quando se trabalha com Big Data, depois que eles são enviados para a nuvem, o ideal é que permaneçam lá. Quando seus dados estiverem na nuvem do Google, é muito rápido transferi-los para outros serviços, como o Compute Engine. Além disso, a saída de buckets para serviços do Google Cloud no mesmo local ou em um sublocal é gratuita. Para mais informações, consulte Preços da rede.

Para copiar um arquivo local grande em um bucket, use:

gsutil cp local-file gs://example-bucket

Para copiar um arquivo grande de um bucket atual, por exemplo, dados públicos do Cloud Storage, use o comando a seguir:

gsutil cp gs://example-source-bucket/file  gs://example-destination-bucket

A gsutil aproveita ao máximo os recursos de upload e download recuperáveis do Google Cloud Storage. Para arquivos grandes, isso é particularmente importante porque a probabilidade de uma falha de rede no ISP aumenta com o tamanho dos dados que estão sendo transferidos. Ao retomar um upload com base em quantos bytes o servidor realmente recebeu, o gsutil evita o envio desnecessário de bytes e garante que o upload possa ser concluído. A mesma lógica é aplicada aos downloads com base no tamanho do arquivo local.

Se gsutil cp não proporcionar o desempenho necessário ao fazer upload de arquivos grandes, considere configurar uploads compostos paralelos.

Como configurar um bucket

É ideal configurar um bucket para tarefas típicas com Big Data, como mover dados para uma classe de armazenamento diferente e configurar o acesso ao registro, o controle de versão de objetos ou uma regra de ciclo de vida.

Para listar os detalhes de configuração de um bucket, use o comando gsutil ls -L -b:

gsutil ls -L -b gs://example-bucket

Na saída, observe as informações de configuração do bucket. A maioria delas também pode ser configurada com a gsutil:

Por exemplo, imagine que você queira manter os arquivos em um determinado bucket por apenas um dia. Para isso, configure a regra de ciclo de vida para o bucket com os seguintes parâmetros:

echo '{ "rule": [{ "action": {"type": "Delete"}, "condition": {"age": 1}}]}' > lifecycle_config.json
gsutil lifecycle set lifecycle_config.json gs://example-bucket

Agora, todos os objetos no seu bucket com mais de um dia serão automaticamente excluídos dele. Verifique a configuração que você acabou de definir com o comando gsutil lifecycle. Outros comandos de configuração funcionam de maneira semelhante:

gsutil lifecycle get gs://example-bucket

Como compartilhar dados em um bucket

Ao usar Big Data, você provavelmente trabalhará em arquivos de maneira colaborativa e precisará permitir o acesso de pessoas ou grupos específicos. As políticas de gerenciamento de identidade e acesso definem quem pode acessar seus arquivos e o que eles podem fazer. Para visualizar a política de IAM de um bucket, use o comando gsutil iam:

gsutil iam get gs://example-bucket

A resposta ao comando mostra membros, que são contas com acesso ao seu bucket, e papéis, que são grupos de permissões concedidas a os membros.

Você pode configurar o bucket para que qualquer pessoa com uma Conta do Google possa listar e visualizar os arquivos no bucket:

gsutil iam ch AllAuthenticatedUsers:objectViewer gs://example-bucket

As três seções a seguir cobrem os três cenários comuns, compartilhamento de dados publicamente, com um grupo e com uma pessoa.

Publicamente

Para um bloco cujo conteúdo deve ser listado e lido por qualquer pessoa na Internet, você pode configurar a política de IAM usando a classificação "AllUsers":

gsutil iam ch AllUsers:objectViewer gs://example-bucket

Com um grupo

Para compartilhar com colaboradores que não são membros do seu projeto do Google Cloud, recomendamos que você crie um Grupo do Google e o adicione ao bucket. Por exemplo, no caso do Grupo do Google gs-announce, configure:

gsutil iam ch group:gs-announce@googlegroups.com:objectViewer gs://example-bucket

Para mais informações, consulte Como usar um grupo para controlar o acesso a objetos.

Com uma pessoa

Para muitos colaboradores, use um grupo para conceder acesso em massa. Para uma pessoa, você pode conceder acesso de leitura da seguinte maneira:

gsutil iam ch user:liz@gmail.com:objectViewer gs://example-bucket

Como mostrar quantos dados estão em um bucket

Use o comando gsutil du para exibir o espaço total utilizado por todos os objetos em um bucket específico. Por exemplo:

gsutil du -sh gs://example-bucket

Consulte a ajuda do comando gsutil du para mais opções disponíveis, incluindo como retornar o tamanho de todos os objetos sob um prefixo.

Também é possível usar o Cloud Monitoring em que o tamanho total de um bucket é informado automaticamente uma vez por dia. Para mais informações, consulte Como determinar o tamanho de um bucket. Se o número de objetos no seu bucket for grande (por exemplo, centenas de milhares ou milhões), essa é uma maneira muito mais eficiente de rastrear o uso do espaço. O comando gsutil du calcula a utilização do espaço ao fazer solicitações de listagem, o que no caso de buckets grandes pode levar muito tempo.

Você pode contar o número de arquivos em um bucket com:

gsutil ls gs://example-bucket/** | wc -l

Como limpar um bucket

Você pode limpar um bucket rapidamente com este comando:

gsutil -m rm gs://example-bucket/**

Como trabalhar com somas de verificação

Ao executar cópias, os comandos gsutil cp e gsutil rsync validam se a soma de verificação do arquivo de origem coincide com a soma de verificação do arquivo de destino. No caso raro em que as somas de verificação não coincidem, a gsutil exclui a cópia inválida e imprime uma mensagem de aviso. Para mais informações, consulte Validação da soma de verificação.

Também é possível usar a gsutil para conseguir a soma de verificação de um arquivo em um bucket ou calcular a soma de verificação de um objeto local. Por exemplo, imagine que você copiou um arquivo de dados públicos do Cloud Life Sciences para seu bucket de trabalho com o comando:

gsutil -m cp gs://genomics-public-data/1000-genomes/vcf/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf gs://example-bucket

Agora, é possível conseguir as somas de verificação da versão do arquivo no bucket público e no seu bucket para garantir que elas coincidem:

gsutil ls -L gs://example-bucket/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf
gsutil ls -L gs://genomics-public-data/1000-genomes/vcf/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf

Agora, imagine que seus dados estejam em um arquivo em um data center local e você os copiou no Cloud Storage. É possível usar gsutil hash para conseguir a soma de verificação do seu arquivo local e compará-la à soma de verificação da cópia do arquivo no bucket. Para conseguir a soma de verificação de um arquivo local, use o comando a seguir:

gsutil hash local-file

Valores MD5

No caso de objetos não compostos, executar gsutil ls -L em um objeto em um bucket retorna uma saída semelhante a esta:

gs://example-bucket/100MBfile.txt:
        Creation time:          Thu, 26 Mar 2015 20:11:51 GMT
        Content-Length:         102400000
        Content-Type:           text/plain
        Hash (crc32c):          FTiauw==
        Hash (md5):             daHmCObxxQdY9P7lp9jj0A==
        ETag:                   CPjo7ILqxsQCEAE=
        Generation:             1427400711419000
        Metageneration:         1
        ACL:            [
        ....

Executar gsutil hash em um arquivo local retorna uma saída semelhante a esta:

Hashing     100MBfile.txt:
Hashes [base64] for 100MBfile.txt:
        Hash (crc32c):          FTiauw==
        Hash (md5):             daHmCObxxQdY9P7lp9jj0A==

Ambas as saídas têm um valor CRC32c e MD5. Não há valor MD5 para objetos compostos, como aqueles criados a partir de uploads compostos paralelos.