Eu tenho um balde com milhares de arquivos nele. Como posso pesquisar no balde? Existe uma ferramenta que você possa recomendar?
Eu tenho um balde com milhares de arquivos nele. Como posso pesquisar no balde? Existe uma ferramenta que você possa recomendar?
Respostas:
O S3 não possui uma "pesquisa neste depósito" nativa, pois o conteúdo real é desconhecido - além disso, como o S3 é baseado em chave / valor, não há maneira nativa de acessar muitos nós ao mesmo tempo, além de mais datastores tradicionais que oferecem um (SELECT * FROM ... WHERE ...)
(em um SQL modelo).
O que você precisará fazer é executar ListBucket
para obter uma lista de objetos no bucket e iterar sobre cada item que executa uma operação personalizada que você implementa - que é sua pesquisa.
Apenas uma observação para adicionar aqui: agora, três anos depois, essa postagem está no topo do Google quando você digita "Como pesquisar em um balde S3".
Talvez você esteja procurando por algo mais complexo, mas se você chegou aqui tentando descobrir como simplesmente encontrar um objeto (arquivo) por seu título, é uma loucura simples:
abra o bucket, selecione "none" no lado direito e comece a digitar o nome do arquivo.
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
Aqui está uma maneira curta e feia de pesquisar nomes de arquivos usando a CLI da AWS :
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
cut -c 32-
apenas retira as informações de data e hora do tamanho do arquivo da saída, que no meu sistema ocupa 32 caracteres. Você não precisa, mas se estiver canalizando a saída para outro comando, pode ser útil ter uma saída "limpa".
include/exclude
. Então,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Existem (pelo menos) dois casos de uso diferentes que podem ser descritos como "pesquisar no bucket":
Procure algo dentro de cada objeto armazenado no balde; isso assume um formato comum para todos os objetos desse bloco (por exemplo, arquivos de texto), etc. etc. Para algo assim, você é forçado a fazer o que Cody Caughlan acabou de responder. A documentação do AWS S3 possui um código de exemplo que mostra como fazer isso com o AWS SDK para Java: Listando Chaves Usando o AWS SDK para Java (lá você também encontrará exemplos de PHP e C #).
Item de lista Pesquise algo nas chaves do objeto contidas nesse bucket; S3 faz ter parcial de suporte para esta, sob a forma de prefixo permitindo correspondências exactas + colapso partidas após um delimitador. Isso é explicado em mais detalhes no AWS S3 Developer Guide . Isso permite, por exemplo, implementar "pastas" usando como chaves de objeto algo como
pasta / subpasta / arquivo.txtSe você seguir esta convenção, a maioria das GUIs do S3 (como o AWS Console) mostrará uma exibição de pasta do seu bucket.
A AWS lançou um novo serviço para consultar os buckets S3 com SQL: Amazon Athena https://aws.amazon.com/athena/
Existem várias opções, nenhuma sendo a solução de texto completo "one shot" simples:
Pesquisa de padrão de nome de chave : pesquisando chaves começando com alguma string - se você projetar nomes de chave com cuidado, poderá ter uma solução bastante rápida.
Pesquise metadados anexados às chaves : ao postar um arquivo no AWS S3, você pode processar o conteúdo, extrair algumas informações meta e anexá-las na forma de cabeçalhos personalizados à chave. Isso permite que você busque nomes de chaves e cabeçalhos sem precisar buscar conteúdo completo. A pesquisa deve ser feita sequencialmente, não existe uma opção de pesquisa "semelhante ao sql" para isso. Com arquivos grandes, isso pode economizar muito tráfego e tempo da rede.
Armazene metadados no SimpleDB : como o ponto anterior, mas com o armazenamento dos metadados no SimpleDB. Aqui você tem sql como instruções select. No caso de conjuntos de dados grandes, você pode atingir os limites do SimpleDB, que podem ser superados (particionar metadados em vários domínios do SimpleDB), mas se você for realmente longe, poderá precisar usar outro tipo de banco de dados de metedados.
Pesquisa sequencial de texto completo do conteúdo - processando todas as chaves uma por uma. Muito lento, se você tiver muitas chaves para processar.
Estamos armazenando 1440 versões de um arquivo por dia (uma por minuto) por alguns anos, usando o depósito de versão, isso é facilmente possível. Mas obter uma versão mais antiga leva tempo, já que é preciso executar sequencialmente versão por versão. Às vezes, eu uso um índice CSV simples com registros, mostrando o tempo de publicação mais o ID da versão. Com isso, eu poderia pular para a versão mais antiga rapidamente.
Como você vê, o AWS S3 não é, por si só, projetado para pesquisas de texto completo, é um serviço de armazenamento simples.
diretamente na exibição de bucket do AWS Console.
Quando você tem milhares ou milhões de arquivos, outra maneira de obter os arquivos desejados é copiá-los para outro local usando a cópia distribuída . Você executa isso no EMR em um trabalho do Hadoop. O interessante da AWS é que eles fornecem sua versão S3 personalizada s3-dist-cp . Permite agrupar arquivos desejados usando uma expressão regular no campo groupBy. Você pode usar isso, por exemplo, em uma etapa personalizada no EMR
[
{
"ActionOnFailure": "CONTINUE",
"Args": [
"s3-dist-cp",
"--s3Endpoint=s3.amazonaws.com",
"--src=s3://mybucket/",
"--dest=s3://mytarget-bucket/",
"--groupBy=MY_PATTERN",
"--targetSize=1000"
],
"Jar": "command-runner.jar",
"Name": "S3DistCp Step Aggregate Results",
"Type": "CUSTOM_JAR"
}
]
Se você estiver no Windows e não tiver tempo para encontrar uma boa grep
alternativa, uma maneira rápida e suja seria:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
e faça uma pesquisa rápida em myfile.txt
O bit "pasta" é opcional.
PS se você não tiver o AWS CLI instalado - aqui está uma lista usando o gerenciador de pacotes Chocolatey
choco install awscli
PPS Se você não possui o gerenciador de pacotes Chocolatey - compre! Sua vida no Windows ficará 10 vezes melhor. (Eu não sou afiliado ao Chocolatey de forma alguma, mas, ei, é realmente necessário).
Como você está na AWS ... Eu acho que você gostaria de usar as ferramentas do CloudSearch. Coloque os dados que deseja pesquisar no serviço deles ... aponte para as teclas S3.
Outra opção é espelhar o bucket do S3 no servidor da Web e percorrer localmente. O truque é que os arquivos locais estão vazios e usados apenas como esqueleto. Como alternativa, os arquivos locais podem conter metadados úteis que você normalmente precisaria obter do S3 (por exemplo, tamanho do arquivo, tipo mimético, autor, carimbo de data / hora, uuid). Ao fornecer um URL para baixar o arquivo, pesquise localmente e forneça um link para o endereço S3.
A transferência de arquivos local é fácil e essa abordagem para o gerenciamento do S3 é independente de idioma. O deslocamento de arquivo local também evita manter e consultar um banco de dados de arquivos ou atrasos, fazendo uma série de chamadas remotas à API para autenticar e obter o conteúdo do bucket.
Você pode permitir que os usuários enviem arquivos diretamente para o servidor via FTP ou HTTP e depois transfira um lote de arquivos novos e atualizados para a Amazon nos horários de pico, recorrendo apenas aos diretórios de arquivos de qualquer tamanho. Na conclusão de uma transferência de arquivos para a Amazon, substitua o arquivo do servidor da web por um vazio com o mesmo nome. Se um arquivo local tiver algum tamanho de arquivo, atenda-o diretamente porque está aguardando transferência em lote.
O jeito que eu fiz é: tenho milhares de arquivos no s3. Eu vi o painel de propriedades de um arquivo na lista. Você pode ver o URI desse arquivo e eu copio colo no navegador - era um arquivo de texto e era renderizado de maneira adequada. Agora troquei o uuid no URL pelo uuid que eu tinha em mãos e bum lá está o arquivo.
Gostaria que a AWS tivesse uma maneira melhor de pesquisar um arquivo, mas isso funcionou para mim.
Tente este comando:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
Em seguida, você pode canalizar isso para um grep para obter tipos de arquivos específicos e fazer o que quiser com eles.
--output text
especifica que a saída será texto sem formatação, não JSON etc., e --query 'Contents[].{Key: Key, Size: Size}'
apenas filtra a saída da lista para o nome e o tamanho do arquivo. Ele não procura Key: Key
ou algo parecido.
Esse é um tópico pouco antigo - mas talvez ajude alguém que ainda pesquisa - sou eu que procuro por um ano.
A solução pode ser " AWS Athena ", onde você pode pesquisar dados como este
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
Atualmente, o preço é de US $ 5 para dados de 1 TB - por exemplo, se sua consulta pesquisar um arquivo de 1 TB três vezes o custo é de US $ 15 - mas, por exemplo, se houver apenas 1 coluna no "formato colunar convertido" que você deseja ler, pagará 1 / 3 de preço significa US $ 1,67 / TB.
Dê uma olhada nesta documentação: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Você pode usar uma Expressão Regular Compatível com Perl (PCRE) para filtrar os nomes.
Fiz algo como abaixo para encontrar padrões no meu balde
def getListOfPrefixesFromS3(dataPath: String, prefix: String, delimiter: String, batchSize: Integer): List[String] = {
var s3Client = new AmazonS3Client()
var listObjectsRequest = new ListObjectsRequest().withBucketName(dataPath).withMaxKeys(batchSize).withPrefix(prefix).withDelimiter(delimiter)
var objectListing: ObjectListing = null
var res: List[String] = List()
do {
objectListing = s3Client.listObjects(listObjectsRequest)
res = res ++ objectListing.getCommonPrefixes
listObjectsRequest.setMarker(objectListing.getNextMarker)
} while (objectListing.isTruncated)
res
}
Para depósitos maiores, isso consome muito tempo, pois todos os resumos de objetos são retornados pelo Aws e não apenas aqueles que correspondem ao prefixo e ao delimitador. Estou procurando maneiras de melhorar o desempenho e, até agora, descobri que devo nomear as chaves e organizá-las adequadamente em baldes.
Eu enfrentei o mesmo problema. Pesquisando no S3 deve ser muito mais fácil do que a situação atual. Por isso, implementei essa ferramenta de código aberto para pesquisar no S3.
SSEARCH é uma ferramenta de pesquisa S3 de código aberto completo. Ele foi implementado sempre tendo em mente que o desempenho é o fator crítico e, de acordo com os benchmarks, ele pesquisa no bucket que contém ~ 1000 arquivos em segundos.
A instalação é simples. Você só baixa o arquivo docker-compose e o executa com
docker-compose up
O SSEARCH será iniciado e você poderá pesquisar qualquer coisa em qualquer bucket que tiver.
Avance para 2020, e use o aws-okta como nosso 2fa, o comando a seguir, enquanto lento demais para percorrer todos os objetos e pastas neste bucket em particular (+270.000) funcionou bem.
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
Use o Amazon Athena para consultar o bucket do S3. Além disso, carregue dados na pesquisa do Amazon Elastic. Espero que isto ajude.
Não é uma resposta técnica, mas criei um aplicativo que permite a pesquisa de caracteres curinga: https://bucketsearch.net/
Ele indexará assincronamente o seu bucket e permitirá que você pesquise os resultados.
É grátis (donationware).
Status 2018-07: A Amazon possui sql nativo, como pesquisa de arquivos csv e json!