Ich habe einen Eimer mit Tausenden von Dateien. Wie kann ich den Eimer durchsuchen? Gibt es ein Tool, das Sie empfehlen können?
Ich habe einen Eimer mit Tausenden von Dateien. Wie kann ich den Eimer durchsuchen? Gibt es ein Tool, das Sie empfehlen können?
Antworten:
S3 verfügt nicht über eine native "Suche in diesem Bucket", da der tatsächliche Inhalt unbekannt ist. Da S3 auf Schlüsseln / Werten basiert, gibt es keine native Möglichkeit, auf viele Knoten gleichzeitig zuzugreifen, auch nicht auf herkömmliche Datenspeicher, die a (SELECT * FROM ... WHERE ...)
(in SQL) anbieten Modell).
Sie müssen ListBucket
lediglich eine Liste der Objekte im Bucket abrufen und dann jedes Element durchlaufen, um eine von Ihnen implementierte benutzerdefinierte Operation auszuführen. Dies ist Ihre Suche.
Nur eine Anmerkung, die Sie hier hinzufügen sollten: Es ist jetzt 3 Jahre später, aber dieser Beitrag ist in Google ganz oben, wenn Sie "So suchen Sie einen S3-Bucket" eingeben.
Vielleicht suchen Sie nach etwas Komplexerem, aber wenn Sie hier gelandet sind, um herauszufinden, wie Sie einfach ein Objekt (eine Datei) anhand seines Titels finden können, ist es verrückt einfach:
Öffnen Sie den Bucket, wählen Sie auf der rechten Seite "none" aus und geben Sie den Dateinamen ein.
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
Hier ist eine kurze und hässliche Möglichkeit, Dateinamen mithilfe der AWS-CLI zu suchen :
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
cut -c 32-
Hackt einfach den Zeitstempel und die Dateigrößeninformationen von der Ausgabe ab, die auf meinem System 32 Zeichen benötigt. Sie brauchen es nicht, aber wenn Sie die Ausgabe in einen anderen Befehl leiten, kann es nützlich sein, eine "saubere" Ausgabe zu haben.
include/exclude
. Also,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Es gibt (mindestens) zwei verschiedene Anwendungsfälle, die als "Search the Bucket" bezeichnet werden könnten:
Suchen Sie in jedem im Eimer gespeicherten Objekt nach etwas . Dies setzt ein gemeinsames Format für alle Objekte in diesem Bucket voraus (z. B. Textdateien) usw. usw. Für so etwas müssen Sie das tun, was Cody Caughlan gerade beantwortet hat. Die AWS S3-Dokumente enthalten Beispielcode, der zeigt, wie dies mit dem AWS SDK für Java gemacht wird: Auflisten von Schlüsseln Verwenden des AWS SDK für Java (dort finden Sie auch PHP- und C # -Beispiele).
Liste item Suche nach etwas in dem Objektschlüssel in diesem Eimer enthalten ist ; S3 unterstützt dies teilweise , indem genaue Präfix-Übereinstimmungen + reduzierende Übereinstimmungen nach einem Trennzeichen zugelassen werden. Dies wird im AWS S3-Entwicklerhandbuch ausführlicher erläutert . Dies ermöglicht es beispielsweise, "Ordner" zu implementieren, indem als Objektschlüssel so etwas wie verwendet wird
Ordner / Unterordner / Datei.txtWenn Sie diese Konvention befolgen, zeigen Ihnen die meisten S3-GUIs (z. B. die AWS-Konsole) eine Ordneransicht Ihres Buckets.
AWS hat einen neuen Service zum Abfragen von S3-Buckets mit SQL veröffentlicht: Amazon Athena https://aws.amazon.com/athena/
Es gibt mehrere Optionen, von denen keine eine einfache Volltextlösung mit einem Schuss ist:
Schlüsselname Mustersuche : Suche nach Schlüsseln , mit einigen Saiten- beginnen , wenn Sie sorgfältig Schlüsselnamen entwerfen, dann können Sie ziemlich schnelle Lösung haben.
An Schlüssel angehängte Metadaten durchsuchen : Wenn Sie eine Datei an AWS S3 senden, können Sie den Inhalt verarbeiten, einige Metainformationen extrahieren und diese Metainformationen in Form von benutzerdefinierten Headern an den Schlüssel anhängen. Auf diese Weise können Sie Schlüsselnamen und Header abrufen, ohne vollständigen Inhalt abrufen zu müssen. Die Suche muss sequentiell erfolgen, dafür gibt es keine "SQL-ähnliche" Suchoption. Bei großen Dateien kann dies viel Netzwerkverkehr und Zeit sparen.
Speichern von Metadaten in SimpleDB : wie im vorherigen Punkt, jedoch mit Speichern der Metadaten in SimpleDB. Hier haben Sie SQL-ähnliche Select-Anweisungen. Bei großen Datenmengen können Sie die SimpleDB-Grenzwerte erreichen, die überwunden werden können (Partitionsmetadaten über mehrere SimpleDB-Domänen hinweg). Wenn Sie jedoch wirklich weit gehen, müssen Sie möglicherweise einen anderen Metedatentyp der Datenbank verwenden.
Sequentielle Volltextsuche des Inhalts - Verarbeitung aller Schlüssel nacheinander. Sehr langsam, wenn Sie zu viele Schlüssel zum Verarbeiten haben.
Wir speichern 1440 Versionen einer Datei pro Tag (eine pro Minute) für ein paar Jahre. Mit dem versionierten Bucket ist dies problemlos möglich. Das Erhalten einer älteren Version braucht jedoch Zeit, da man Version für Version nacheinander wechseln muss. Manchmal verwende ich einen einfachen CSV-Index mit Datensätzen, der die Veröffentlichungszeit plus die Versions-ID anzeigt. Wenn dies der Fall ist, kann ich ziemlich schnell zur älteren Version springen.
Wie Sie sehen, ist AWS S3 nicht für die Volltextsuche konzipiert, sondern ein einfacher Speicherdienst.
direkt in der AWS Console-Bucket-Ansicht.
Wenn Sie Tausende oder Millionen von Dateien haben, können Sie die gewünschten Dateien auch mithilfe einer verteilten Kopie an einen anderen Speicherort kopieren . Sie führen dies auf EMR in einem Hadoop-Job aus. Das Coole an AWS ist, dass sie ihre benutzerdefinierte S3-Version s3-dist-cp bereitstellen . Sie können gewünschte Dateien mithilfe eines regulären Ausdrucks im Feld groupBy gruppieren. Sie können dies beispielsweise in einem benutzerdefinierten Schritt für EMR verwenden
[
{
"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"
}
]
Wenn Sie unter Windows arbeiten und keine Zeit haben, eine gute grep
Alternative zu finden, ist ein schneller und schmutziger Weg:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
und dann eine Schnellsuche in myfile.txt durchführen
Das "Ordner" -Bit ist optional.
PS: Wenn Sie AWS CLI nicht installiert haben, finden Sie hier einen Einzeiler mit Chocolatey Package Manager
choco install awscli
PPS Wenn Sie den Chocolatey-Paketmanager nicht haben, holen Sie ihn sich! Ihr Leben unter Windows wird 10x besser. (Ich bin in keiner Weise mit Chocolatey verbunden, aber hey, es ist wirklich ein Muss).
Angesichts der Tatsache, dass Sie sich in AWS befinden, würde ich denken, dass Sie die CloudSearch-Tools verwenden möchten. Stellen Sie die Daten, die Sie durchsuchen möchten, in ihren Dienst. Zeigen Sie auf die S3-Tasten.
Eine andere Möglichkeit besteht darin, den S3-Bucket auf Ihrem Webserver zu spiegeln und lokal zu durchlaufen. Der Trick ist, dass die lokalen Dateien leer sind und nur als Skelett verwendet werden. Alternativ könnten die lokalen Dateien nützliche Metadaten enthalten, die Sie normalerweise von S3 benötigen würden (z. B. Dateigröße, Mimetyp, Autor, Zeitstempel, UUID). Wenn Sie eine URL zum Herunterladen der Datei angeben, suchen Sie lokal und geben Sie einen Link zur S3-Adresse an.
Das Durchlaufen lokaler Dateien ist einfach und dieser Ansatz für die S3-Verwaltung ist sprachunabhängig. Durch das Durchlaufen lokaler Dateien wird auch das Verwalten und Abfragen einer Datenbank mit Dateien oder Verzögerungen beim Ausführen einer Reihe von Remote-API-Aufrufen zur Authentifizierung und zum Abrufen des Bucket-Inhalts vermieden.
Sie können Benutzern erlauben, Dateien über FTP oder HTTP direkt auf Ihren Server hochzuladen und dann zu Spitzenzeiten einen Stapel neuer und aktualisierter Dateien an Amazon zu übertragen, indem Sie einfach über die Verzeichnisse für Dateien beliebiger Größe rekursieren. Ersetzen Sie nach Abschluss einer Dateiübertragung an Amazon die Webserverdatei durch eine leere Datei mit demselben Namen. Wenn eine lokale Datei eine Dateigröße hat, stellen Sie sie direkt bereit, da sie auf die Stapelübertragung wartet.
So habe ich es gemacht: Ich habe Tausende von Dateien in s3. Ich habe das Eigenschaftenfenster einer Datei in der Liste gesehen. Sie können den URI dieser Datei sehen und ich habe ihn in den Browser kopiert - es war eine Textdatei und sie wurde gut gerendert. Jetzt habe ich die UUID in der URL durch die UUID ersetzt, die ich zur Hand hatte, und dort boomt die Datei.
Ich wünschte, AWS hätte eine bessere Möglichkeit, eine Datei zu durchsuchen, aber das hat bei mir funktioniert.
Versuchen Sie diesen Befehl:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
Dann können Sie dies in ein grep leiten, um bestimmte Dateitypen dazu zu bringen, mit ihnen zu tun, was Sie wollen.
--output text
Gibt an, dass die Ausgabe nur Text ist, nicht JSON usw., und --query 'Contents[].{Key: Key, Size: Size}'
filtert lediglich die Ausgabe der Liste nach Dateiname und Dateigröße. Es wird nicht nach Key: Key
oder dergleichen gesucht .
Dies ist ein bisschen alter Thread - aber vielleicht helfen Sie jemandem, der noch sucht - ich bin derjenige, der ein Jahr danach sucht.
Die Lösung könnte " AWS Athena " sein, wo Sie nach solchen Daten suchen können
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
Derzeit beträgt der Preis für 1-TB-Daten 5 US-Dollar. Wenn Ihre Abfragesuche beispielsweise über eine 1-TB-Datei dreimal so hoch ist, betragen Ihre Kosten 15 US-Dollar. Wenn beispielsweise nur eine Spalte im "konvertierten Spaltenformat" vorhanden ist, was Sie lesen möchten, zahlen Sie 1 US-Dollar / 3 des Preises bedeutet 1,67 $ / TB.
Schauen Sie sich diese Dokumentation an: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Sie können einen Perl-kompatiblen regulären Ausdruck (PCRE) verwenden, um die Namen zu filtern.
Ich habe etwas wie unten gemacht, um Muster in meinem Eimer zu finden
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
}
Bei größeren Buckets nimmt dies zu viel Zeit in Anspruch, da alle Objektzusammenfassungen von den Aws zurückgegeben werden und nicht nur diejenigen, die dem Präfix und dem Trennzeichen entsprechen. Ich suche nach Möglichkeiten, um die Leistung zu verbessern, und bisher habe ich nur festgestellt, dass ich die Schlüssel benennen und sie in Eimern richtig organisieren sollte.
Ich hatte das gleiche Problem. Die Suche in S3 sollte viel einfacher sein als in der aktuellen Situation. Deshalb habe ich dieses Open-Source-Tool für die Suche in S3 implementiert.
SUCHE ist ein Open Source S3-Suchwerkzeug. Es wurde implementiert, wobei stets berücksichtigt wurde, dass die Leistung der entscheidende Faktor ist, und gemäß den Benchmarks wird der Bucket durchsucht, der innerhalb von Sekunden ~ 1000 Dateien enthält.
Die Installation ist einfach. Sie laden nur die Docker-Compose-Datei herunter und führen sie mit aus
docker-compose up
SSEARCH wird gestartet und Sie können alles in jedem Eimer suchen, den Sie haben.
Schneller Vorlauf bis 2020 und die Verwendung von aws-okta als 2fa, der folgende Befehl, während das Durchlaufen aller Objekte und Ordner in diesem bestimmten Bucket (+270.000) höllisch langsam funktionierte, funktionierte einwandfrei.
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
Keine technische Antwort, aber ich habe eine Anwendung erstellt, die die Platzhaltersuche ermöglicht: https://bucketsearch.net/
Es indiziert Ihren Bucket asynchron und ermöglicht Ihnen dann, die Ergebnisse zu durchsuchen.
Es ist kostenlos zu benutzen (Spendenware).
Status 2018-07: Amazon hat native SQL-ähnliche Suche nach CSV- und JSON-Dateien!