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 o gsutil, você pode copiar muitos arquivos em paralelo com um único comando, copiar arquivos grandes com eficiência, calcular somas de verificação nos seus dados e medir o desempenho do seu computador local para o Cloud Storage.

Nesta página, nos concentraremos no uso do gsutil para tarefas com muitos dados. 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

Você pode usar curingas para corresponder a um conjunto específico de nomes para 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 muitos dados, uma vez que eles estejam na nuvem, precisam permanecer 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, suponha que você queira manter os arquivos em um determinado bucket por apenas um dia. Para isso, você pode configurar a regra de ciclo de vida para o bucket com:

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. 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.