Sistema de arquivos baseado em S3 capaz de solicitar apenas parte do arquivo

5

Estou armazenando grandes conjuntos de dados em s3, mas em um determinado computador em meu cluster, meu programa precisa ler apenas um pequeno subconjunto dos dados.

Eu primeiro tentei o s3fs, mas ele carrega primeiro todo o arquivo, o que leva muito tempo.

Há algum sistema de arquivos com backup s3 que faça uso do parâmetro bytes da API do S3, de modo que os comandos internos de leitura (e busca) leiam apenas a parte desejada do arquivo?

Como um exemplo prático, se eu corro:

tail -c 1024 huge_file_on_s3

apenas o último 1kb deve ser solicitado (via parâmetro de bytes), o que significa que eu deveria obter o resultado muito rápido.

(Eu não estou preocupado em escrever de volta para o S3; apenas ler a partir dele)

    
por UsAaR33 12.10.2011 / 02:50

2 respostas

1

Você pode usar o intervalo de HTTP para buscar um intervalo de bytes de um arquivo S3, essa é a maneira documentada de conseguir isso no Documentos da API do S3 . Uma biblioteca que pode ajudar é o boto , escrito em python. Com o boto, você pode fazer algo como:

tempfile = open(tempFilePath, 'wb')
S3Key.get_contents_to_file(tempfile, headers={'Range': 'bytes=0-100000'}

veja link

Se você pode substituir a necessidade de ter um sistema de arquivos com um programa python ou similar, ele funcionará melhor. O S3 não deve ser usado como um sistema de arquivos, e ferramentas como s3fs são desaprovadas. Eu usei s3fs em produção por um tempo e sempre foi mais problema do que vale a pena. É bom para peças não críticas, mas não é compatível com posix. Além disso, não consigo imaginar que você encontre uma ferramenta que expõe a API HTTP do S3.

No entanto, ao olhar para os problemas recentes do s3fs, descobri que, se você desativar o cache (opção use_cache), o s3fs não baixará o arquivo inteiro. Problema: link O s3fs mais recente parece ter o uso_cache desativado por padrão.

    
por 04.09.2014 / 14:10
0

Eu imagino que a maioria dos servidores suportaria os cabeçalhos do intervalo HTTP. 'bytes' soa como se fosse um recurso interno do S3, enquanto os cabeçalhos do Range são suportados por todos os servidores modernos que eu conheço.

    
por 11.02.2012 / 02:49