J'ai un seau avec des milliers de fichiers. Comment puis-je rechercher le seau? Y a-t-il un outil que vous pouvez recommander?
S3 n'a pas de "recherche dans ce seau" en natif car le contenu réel est inconnu. De plus, étant donné que S3 est basé sur une clé/valeur, il n'existe pas de moyen natif d'accéder à de nombreux nœuds à la fois dans des datastores plus traditionnels offrant un (SELECT * FROM ... WHERE ...)
(dans une Modèle SQL).
Ce que vous devez faire, c'est exécuter ListBucket
pour obtenir une liste d'objets dans le compartiment, puis effectuer une itération sur chaque élément exécutant une opération personnalisée que vous implémentez - ce qui correspond à votre recherche.
Juste une remarque à ajouter ici: nous en sommes maintenant à trois ans. Pourtant, cet article est en haut de Google lorsque vous tapez "Comment effectuer une recherche dans un seau S3".
Peut-être cherchez-vous quelque chose de plus complexe, mais si vous arrivez ici en essayant de trouver un moyen de trouver simplement un objet (fichier) par son titre, c'est simple comme bonjour:
ouvrez le compartiment, sélectionnez "none" dans la partie droite et commencez à taper le nom du fichier.
http://docs.aws.Amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
Voici un moyen court et laid de rechercher des noms de fichiers à l'aide de AWS CLI :
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
Il y a (au moins) deux cas d'utilisation différents qui pourraient être décrits comme "recherchez le seau":
Rechercher quelque chose dans chaque objet stocké dans le compartiment; cela suppose un format commun pour tous les objets de ce seau (par exemple, les fichiers texte), etc. etc. La documentation AWS S3 contient un exemple de code indiquant comment procéder. Le kit AWS SDK for Java: Liste des clés à l'aide du kit AWS SDK for Java (vous trouverez également des exemples PHP et C #).
Élément de liste Rechercher quelque chose dans l'objet keys contenu dans ce compartiment; S3 a a le support {partiel} _, sous la forme permettant les correspondances préfixes exactes + les correspondances réductrices après un délimiteur. Ceci est expliqué plus en détail dans AWS S3 Developer Guide . Cela permet, par exemple, d'implémenter des "dossiers" en utilisant comme clés d'objet quelque chose comme
dossier/sous-dossier/fichier.txtSi vous suivez cette convention, la plupart des interfaces graphiques S3 (telles que la console AWS) vous montreront une vue des dossiers de votre compartiment.
Il y a plusieurs options, aucune n'étant simple, la solution de texte intégral "one shot":
Recherche de modèle de nom de clé : Recherche de clés commençant par une chaîne - si vous concevez les noms de clé avec soin, vous disposerez peut-être d'une solution assez rapide.
Recherche de métadonnées attachées aux clés : lors de la publication d'un fichier sur AWS S3, vous pouvez traiter le contenu, extraire des méta-informations et attacher ces méta-informations sous forme d'en-têtes personnalisés dans la clé. Cela vous permet d'extraire les noms de clé et les en-têtes sans avoir à extraire le contenu complet. La recherche doit être effectuée séquentiellement, il n’existe pas d’option de recherche "comme" pour cela. Avec des fichiers volumineux, cela peut économiser beaucoup de trafic réseau et de temps.
Stockez les métadonnées sur SimpleDB : comme point précédent, mais en stockant les métadonnées sur SimpleDB. Ici vous avez sql comme les instructions select. Dans le cas d'ensembles de données volumineux, vous pouvez atteindre les limites de SimpleDB, ce qui peut être surmonté (métadonnées de partition sur plusieurs domaines de SimpleDB), mais si vous allez vraiment très loin, vous devrez peut-être utiliser un autre type de base de données metedata.
Recherche de texte intégral séquentielle du contenu - traitement de toutes les clés une par une. Très lent si vous avez trop de clés à traiter.
Nous stockons 1440 versions d'un fichier par jour (une par minute) pendant quelques années. À l'aide d'un seau versionné, il est facilement possible. Mais obtenir une version plus ancienne prend du temps, car il faut passer séquentiellement version par version. Parfois, j'utilise un simple index CSV avec des enregistrements, indiquant l'heure de publication et l'identifiant de la version. Cela permet de passer rapidement à l'ancienne version.
Comme vous le voyez, AWS S3 n'est pas conçu pour la recherche de texte intégral, il s'agit d'un simple service de stockage.
AWS a publié un nouveau service permettant d'interroger les segments S3 avec SQL: Amazon Athena https://aws.Amazon.com/athena/
directement dans la vue du compartiment AWS Console.
Lorsque vous avez des milliers ou des millions de fichiers, vous pouvez également les copier dans un autre emplacement à l’aide de Distributed Copy. Vous l'exécutez sur EMR dans un travail Hadoop. Le bon côté d’AWS est qu’ils fournissent leur version S3 personnalisée s3-dist-cp . Il vous permet de regrouper les fichiers recherchés à l'aide d'une expression régulière dans le champ groupBy. Vous pouvez utiliser ceci par exemple dans une étape personnalisée sur 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"
}
]
Étant donné que vous êtes dans AWS ... je pense que vous voudriez utiliser leurs outils CloudSearch. Mettez les données que vous voulez rechercher dans leur service ... faites les pointer sur les touches S3.
Une autre option consiste à mettre en miroir le compartiment S3 sur votre serveur Web et à le parcourir localement. L'astuce est que les fichiers locaux sont vides et utilisés uniquement comme squelette. Les fichiers locaux peuvent également contenir des métadonnées utiles que vous devriez normalement obtenir de S3 (par exemple, taille du fichier, type MIME, auteur, horodatage, uuid). Lorsque vous fournissez une URL pour télécharger le fichier, effectuez une recherche locale et fournissez un lien vers l'adresse S3.
La traversée de fichiers locaux est facile et cette approche pour la gestion S3 est indépendante de la langue. La traversée de fichiers locaux évite également la maintenance et l'interrogation d'une base de données de fichiers ou les retards dans le lancement d'une série d'appels d'API distants pour s'authentifier et obtenir le contenu du compartiment.
Vous pouvez permettre aux utilisateurs de télécharger des fichiers directement sur votre serveur via FTP ou HTTP, puis de transférer un lot de fichiers nouveaux et mis à jour sur Amazon en dehors des heures de pointe, en récurant simplement sur les répertoires des fichiers de toute taille. À la fin du transfert de fichier vers Amazon, remplacez le fichier du serveur Web par un fichier vide du même nom. Si un fichier local a une taille de fichier, envoyez-le directement, car il attend le transfert par lots.
Si vous utilisez Windows et que vous n’avez pas le temps de trouver une alternative agréable à grep
, voici un moyen rapide et dangereux de procéder:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
puis faites une recherche rapide dans myfile.txt
Le bit "dossier" est optionnel.
P.S. Si vous n'avez pas installé l'AWS CLI, voici un one-liner utilisant le gestionnaire de packages Chocolatey.
choco install awscli
P.P.S. Si vous n'avez pas le gestionnaire de paquets Chocolatey, procurez-vous! Votre vie sur Windows sera 10 fois meilleure. (Je ne suis en aucun cas affilié à Chocolatey, mais bon, c'est vraiment un must-have).
Essayez cette commande:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
Ensuite, vous pouvez diriger ceci dans un grep pour obtenir des types de fichiers spécifiques pour en faire tout ce que vous voulez.
J'ai fait quelque chose comme ci-dessous pour trouver des motifs dans mon seau
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
}
Pour les grands compartiments, cela prend trop de temps car tous les résumés d'objet sont renvoyés par les Aw et pas seulement ceux qui correspondent au préfixe et au délimiteur. Je cherche des moyens d’améliorer les performances et jusqu’à présent, j’ai seulement constaté que je devais nommer les clés et les organiser correctement.
Consultez cette documentation: http://docs.aws.Amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Vous pouvez utiliser une expression régulière compatible Perl (PCRE) pour filtrer les noms.
J'ai essayé de la manière suivante
aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv
Ceci sort le chemin réel où le fichier existe
2019-04-05 01:18:35 111111 folder1/2019/03/20/filename.csv
Statut 2018-07: Amazon a un SQL natif comme la recherche de fichiers csv et json!
Voici comment je l'ai fait: J'ai des milliers de fichiers dans s3 . J'ai vu le panneau des propriétés d'un fichier dans la liste. Vous pouvez voir l'URI de ce fichier et je l'ai copié dans le navigateur - il s'agissait d'un fichier texte qui a été rendu correctement. Maintenant, j'ai remplacé l'uuid dans l'URL par l'uuid que j'avais sous la main et le fichier est en plein essor.
J'aimerais que AWS dispose d'un meilleur moyen de rechercher un fichier, mais cela a fonctionné pour moi.
C'est un peu vieux fil - mais peut-être aider quelqu'un qui cherche encore - c'est moi qui le cherche un an.
La solution peut être " AWS Athena " où vous pouvez rechercher des données comme celle-ci.
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
Le prix actuel est 5 USD pour les données de 1 To - donc si votre recherche effectue une recherche sur un fichier de 1 To, 3 fois votre coût est de 15 USD, mais s'il n'y a qu'une colonne dans le "format de colonne converti", vous paierez 1/3 du prix 1,67 USD/To.