Odpowiedzi:
S3 nie posiada natywny „szukaj Bucket” Od rzeczywistej zawartości jest nieznany - również od S3 jest klucz / wartość na podstawie nie ma natywny sposób na dostęp do wielu węzłów naraz ala bardziej tradycyjnych magazynów danych, które oferują (SELECT * FROM ... WHERE ...)
(w SQL Model).
To, co musisz zrobić, to ListBucket
uzyskać listę obiektów w zasobniku, a następnie iterować po każdym elemencie, wykonując niestandardową operację, którą zaimplementujesz - czyli wyszukiwanie.
Tylko uwaga do dodania: jest teraz 3 lata później, ale ten post jest na pierwszym miejscu w Google, gdy wpiszesz „Jak przeszukać wiadro S3”.
Być może szukasz czegoś bardziej złożonego, ale jeśli wylądowałeś tutaj, próbując dowiedzieć się, jak po prostu znaleźć obiekt (plik) według jego tytułu, to jest szalenie proste:
otwórz zasobnik, wybierz „brak” po prawej stronie i zacznij wpisywać nazwę pliku.
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
Oto krótki i brzydki sposób wyszukiwania nazw plików za pomocą interfejsu wiersza polecenia AWS :
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
cut -c 32-
po prostu odcina informacje o sygnaturze czasowej i rozmiarze pliku z danych wyjściowych, które w moim systemie zajmują 32 znaki. Nie potrzebujesz tego, ale jeśli przesyłasz dane wyjściowe do innej komendy, przydatne może być „czyste” wyjście.
include/exclude
. A więcaws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Istnieją (co najmniej) dwa różne przypadki użycia, które można opisać jako „przeszukaj zasobnik”:
Wyszukaj coś w każdym obiekcie przechowywanym w wiadrze; zakłada to wspólny format dla wszystkich obiektów w tym zasobniku (powiedzmy, plików tekstowych) itd. W przypadku czegoś takiego, musisz zrobić to, na co właśnie odpowiedział Cody Caughlan. Dokumentacja AWS S3 zawiera przykładowy kod pokazujący, jak to zrobić z AWS SDK for Java: Listing Keys Using the AWS SDK for Java (znajdziesz tam również przykłady PHP i C #).
Element listy Szukaj czegoś w kluczach obiektów zawartych w tym zasobniku; S3 ma mieć częściowe wsparcie dla tego, w postaci prefiksu umożliwiając dokładne mecze + zawaleniem mecze po ogranicznik. Jest to wyjaśnione bardziej szczegółowo w podręczniku programisty AWS S3 . Pozwala to na przykład na implementację "folderów" poprzez użycie czegoś w rodzaju kluczy obiektowych
folder / podfolder / plik.txtJeśli zastosujesz się do tej konwencji, większość graficznych interfejsów użytkownika S3 (takich jak konsola AWS) pokaże ci widok folderu twojego zasobnika.
AWS wydało nową usługę do wysyłania zapytań do zasobników S3 za pomocą SQL: Amazon Athena https://aws.amazon.com/athena/
Dostępnych jest wiele opcji, z których żadna nie jest prostym rozwiązaniem pełnego tekstu „jednorazowego”:
Wyszukiwanie wzorców nazw kluczy : Wyszukiwanie kluczy zaczynających się od jakiegoś ciągu - jeśli starannie projektujesz nazwy kluczy, możesz mieć raczej szybkie rozwiązanie.
Przeszukuj metadane dołączone do kluczy : podczas wysyłania pliku do AWS S3 możesz przetworzyć zawartość, wyodrębnić niektóre metadane i dołączyć te metadane w postaci niestandardowych nagłówków do klucza. Pozwala to na pobieranie nazw kluczy i nagłówków bez konieczności pobierania całej zawartości. Wyszukiwanie musi być wykonywane sekwencyjnie, nie ma do tego opcji wyszukiwania typu „sql like”. W przypadku dużych plików może to zaoszczędzić sporo ruchu sieciowego i czasu.
Przechowuj metadane w SimpleDB : jak w poprzednim punkcie, ale z przechowywaniem metadanych w SimpleDB. Tutaj masz instrukcje sql jak select. W przypadku dużych zbiorów danych możesz przekroczyć limity SimpleDB, które można pokonać (metadane partycji w wielu domenach SimpleDB), ale jeśli zajdziesz naprawdę daleko, może być konieczne użycie innego typu bazy danych metedanych.
Sekwencyjne wyszukiwanie pełnotekstowe treści - przetwarzanie wszystkich kluczy jeden po drugim. Bardzo wolno, jeśli masz zbyt wiele kluczy do przetworzenia.
Przechowujemy 1440 wersji pliku dziennie (jedna na minutę) przez kilka lat, używając wersjonowanego wiadra, jest to łatwe. Ale uzyskanie starszej wersji zajmuje trochę czasu, ponieważ trzeba przechodzić sekwencyjnie z wersji na wersję. Czasami używam prostego indeksu CSV z rekordami, pokazującego czas publikacji plus identyfikator wersji, mając to, mogłem dość szybko przeskoczyć do starszej wersji.
Jak widać, AWS S3 nie jest sam w sobie przeznaczony do wyszukiwania pełnotekstowego, jest to prosta usługa przechowywania.
bezpośrednio w widoku zasobnika konsoli AWS.
Jeśli masz tysiące lub miliony plików, innym sposobem na uzyskanie potrzebnych plików jest skopiowanie ich do innej lokalizacji przy użyciu kopii dystrybucyjnej . Uruchamiasz to na EMR w zadaniu Hadoop. Fajną rzeczą w AWS jest to, że zapewniają swoją niestandardową wersję S3 s3-dist-cp . Umożliwia grupowanie żądanych plików za pomocą wyrażenia regularnego w polu GroupBy. Możesz tego użyć na przykład w niestandardowym kroku dotyczącym 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"
}
]
Jeśli korzystasz z systemu Windows i nie masz czasu na znalezienie fajnej grep
alternatywy, szybkim i nieprzyjemnym sposobem byłoby:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
a następnie wykonaj szybkie wyszukiwanie w pliku myfile.txt
Bit „folderu” jest opcjonalny.
PS, jeśli nie masz zainstalowanego interfejsu wiersza polecenia AWS - oto jedna linijka używająca menedżera pakietów Chocolatey
choco install awscli
PPS Jeśli nie masz menedżera pakietów Chocolatey - weź go! Twoje życie w systemie Windows będzie 10 razy lepsze. (Nie jestem w żaden sposób powiązany z Chocolatey, ale hej, to naprawdę pozycja obowiązkowa).
Biorąc pod uwagę, że jesteś w AWS ... myślę, że chciałbyś użyć ich narzędzi CloudSearch. Umieść dane, które chcesz przeszukać w ich usługach ... niech wskazują na klucze S3.
Inną opcją jest dublowanie zasobnika S3 na serwerze internetowym i przechodzenie lokalnie. Sztuczka polega na tym, że lokalne pliki są puste i używane tylko jako szkielet. Alternatywnie, lokalne pliki mogą zawierać przydatne metadane, które normalnie musiałbyś uzyskać z S3 (np. Rozmiar pliku, typ MIME, autor, znacznik czasu, identyfikator UUID). Podając adres URL do pobrania pliku, wyszukaj lokalnie i podaj łącze do adresu S3.
Przechodzenie przez pliki lokalne jest łatwe, a to podejście do zarządzania S3 jest niezależne od języka. Przechodzenie przez lokalne pliki pozwala również uniknąć utrzymywania i wysyłania zapytań do bazy danych plików lub opóźnień w wykonaniu serii zdalnych wywołań interfejsu API w celu uwierzytelnienia i pobrania zawartości zasobnika.
Możesz zezwolić użytkownikom na przesyłanie plików bezpośrednio na serwer przez FTP lub HTTP, a następnie przesyłanie partii nowych i zaktualizowanych plików do Amazon poza godzinami szczytu, po prostu powtarzając katalogi dla plików o dowolnym rozmiarze. Po zakończeniu przesyłania pliku do Amazon zastąp plik serwera WWW pustym plikiem o tej samej nazwie. Jeśli plik lokalny ma jakikolwiek rozmiar pliku, podaj go bezpośrednio, ponieważ oczekuje na transfer wsadowy.
Sposób, w jaki to zrobiłem, jest następujący: mam tysiące plików w s3. Widziałem panel właściwości jednego pliku na liście. Możesz zobaczyć URI tego pliku i skopiowałem go, wkleiłem go do przeglądarki - był to plik tekstowy i ładnie się wyrenderował. Teraz zamieniłem uuid w adresie URL na uuid, który miałem pod ręką i bum tam jest.
Chciałbym, żeby AWS miał lepszy sposób wyszukiwania pliku, ale to zadziałało.
Wypróbuj to polecenie:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
Następnie możesz przesłać to do grepa, aby uzyskać określone typy plików, aby robić z nimi, co chcesz.
--output text
określa, że dane wyjściowe będą zwykłym tekstem, a nie JSON itp. I --query 'Contents[].{Key: Key, Size: Size}'
po prostu filtrują dane wyjściowe listy według nazwy i rozmiaru pliku. Nie wyszukuje Key: Key
ani tym podobnych.
To trochę stary wątek - ale może pomóc komuś, kto wciąż szuka - to ja szukam tego przez rok.
Rozwiązaniem może być „ AWS Athena ”, w którym można przeszukiwać takie dane
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
Obecnie cena wynosi 5 USD za 1 TB danych - na przykład, jeśli zapytanie przeszukuje jeden plik o pojemności 1 TB 3 razy, gdy koszt wyniesie 15 USD, ale na przykład, jeśli jest tylko 1 kolumna w „przekonwertowanym formacie kolumnowym”, co chcesz przeczytać, zapłacisz 1 / 3 ceny oznacza 1,67 USD / TB.
Spójrz na tę dokumentację: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Do filtrowania nazw można użyć wyrażenia regularnego zgodnego z Perl (PCRE).
Zrobiłem coś jak poniżej, aby znaleźć wzory w moim wiadrze
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
}
W przypadku większych zasobników zajmuje to zbyt dużo czasu, ponieważ wszystkie podsumowania obiektów są zwracane przez Aws, a nie tylko te, które pasują do przedrostka i separatora. Szukam sposobów na poprawę wydajności i do tej pory odkryłem, że powinienem tylko nazwać klucze i odpowiednio uporządkować je w wiadrach.
Miałem ten sam problem. Wyszukiwanie w S3 powinno być dużo łatwiejsze niż obecna sytuacja. Dlatego wdrożyłem to narzędzie open source do wyszukiwania w S3.
SSEARCH to w pełni otwarte narzędzie wyszukiwania S3. Został wdrożony zawsze mając na uwadze, że wydajność jest czynnikiem krytycznym i zgodnie z testami porównawczymi przeszukuje zasobnik zawierający ~ 1000 plików w ciągu kilku sekund.
Instalacja jest prosta. Pobierasz tylko plik docker-compose i uruchamiasz go z
docker-compose up
SSEARCH zostanie uruchomione i możesz przeszukiwać wszystko w dowolnym posiadanym zasobniku.
Przewiń do roku 2020 i używając aws-okta jako naszego 2fa, następujące polecenie, choć powolne jak diabli, aby iterować przez wszystkie obiekty i foldery w tym konkretnym zasobniku (+270 000) działało dobrze.
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
Użyj usługi Amazon Athena, aby wysłać zapytanie do zasobnika S3. Załaduj również dane do wyszukiwania Amazon Elastic. Mam nadzieję że to pomoże.
Nie jest to techniczna odpowiedź, ale stworzyłem aplikację, która umożliwia wyszukiwanie za pomocą symboli wieloznacznych: https://bucketsearch.net/
Asynchronicznie zindeksuje Twój zasobnik, a następnie umożliwi przeszukiwanie wyników.
To nic nie kosztuje (darowizny).
Stan 2018-07: Amazon ma natywne sql, takie jak wyszukiwanie plików csv i json!