Jak przeszukiwać wiadro Amazon S3?


Odpowiedzi:


31

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 ListBucketuzyskać listę obiektów w zasobniku, a następnie iterować po każdym elemencie, wykonując niestandardową operację, którą zaimplementujesz - czyli wyszukiwanie.


42
Tak już nie jest. Zobacz odpowiedź Rhondy poniżej: stackoverflow.com/a/21836343/1101095
Nate

11
Do wszystkich popierających powyższy komentarz: OP nie wskazuje, czy chcą przeszukiwać nazwy plików, czy zawartość klucza (np. Zawartość pliku). Tak więc odpowiedź @ rhonda nadal może być niewystarczająca. Wygląda na to, że ostatecznie jest to ćwiczenie pozostawione konsumentowi, ponieważ korzystanie z konsoli S3 jest trudno dostępne dla użytkowników aplikacji i zwykłych użytkowników. Jest to w zasadzie tylko przywiązanie do właściciela zasobnika i / lub ról IAM.
Cody Caughlan

Czy istnieje usługa indeksująca, taka jak lucene.net, do indeksowania tych dokumentów zasobnika?
Munavvar

Wracałem do tej odpowiedzi i zbudowałem narzędzie, które pomoże: bucketsearch.net - umożliwia wyszukiwanie za pomocą symboli wieloznacznych itp.
Jon M

251

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


43
To jest dokładnie to, czego szukałem. Straszny projekt interfejsu użytkownika, w którym nie ma żadnych wizualnych wskazówek
Keith Entzeroth,

2
Musisz wybrać plik w zasobniku, a następnie zacząć pisać.
cabe56

30
Nadal możesz wyszukiwać tylko według prefiksu nazwy przedmiotu.
Daniel Flippance

21
To jest absolutnie irytujące! Ludzie mówią o czymś po prawej stronie lub żółtym pudełku, ale nic nie mogę znaleźć. Ta sama wiadomość „Wpisz prefiks ...”. Dlaczego „Zasobnik wyszukiwania” nie jest domyślny? Jest prawie tak samo nieodkryty jak oprogramowanie Atlassian ...
vegather

40
Czy ta odpowiedź jest nadal aktualna? Nie widzę żadnego „brak” po prawej stronie ”, a link do dokumentacji w odpowiedzi prowadzi teraz do innej strony.
BiscuitBaker,

112

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-

1
aws s3 ls s3: // your-bucket --recursive | grep your-search Wystarczająco dobre dla moich poszukiwań, dzięki Abe Voelker.
man.2067067

3
Wszystkie łyżki: aws s3 ls | awk '{print $ 3}' | podczas czytania linii; do echo $ line; aws s3 ls s3: // $ line --recursive | grep your-search; gotowe
Akom

1
co jest wycięte -c 32- bez tego również wyszukiwanie działa
sunil

1
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.
Abe Voelker

CLI obsługuje include/exclude. A więcaws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Mohnish

25

Istnieją (co najmniej) dwa różne przypadki użycia, które można opisać jako „przeszukaj zasobnik”:

  1. 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 #).

  2. 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.txt
    Jeś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.


docs do używania przedrostka w rubinowym
James

22

AWS wydało nową usługę do wysyłania zapytań do zasobników S3 za pomocą SQL: Amazon Athena https://aws.amazon.com/athena/


2
argh… Otrzymuję… „Atena jest niedostępna w zachodnich stanach USA (Północna Kalifornia). Wybierz inny region”.
Clintm

2
To narzut z całym tym zapytaniem SQL, biorąc pod uwagę, że chciałem tylko grep
Ali Gajani

4
@Clintm - change to us-east-1 (N. Virginia)
slocumro

21

Dostępnych jest wiele opcji, z których żadna nie jest prostym rozwiązaniem pełnego tekstu „jednorazowego”:

  1. 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.

  2. 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.

  3. 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.

  4. 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.


4

Wyszukaj według prefiksu w konsoli S3

bezpośrednio w widoku zasobnika konsoli AWS.

wprowadź opis obrazu tutaj

Skopiuj potrzebne pliki za pomocą s3-dist-cp

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"
    }
]

Wydawałoby się, że widok segmentu konsoli AWS nie przechodzi plik po pliku, stosując filtr. Jest w stanie zwrócić wyniki niezwykle szybko, pod warunkiem, że szukam podciągu pliku (ów). Czy istnieje klient / narzędzie / API, którego mogę użyć innego niż konsola AWS, aby uzyskać wyniki w tym samym czasie. @ high6. W przeszłości próbowałem użyć boto, ale najlepszym podejściem wydaje się być iterowanie całego zasobnika, stosując kryteria wyszukiwania do każdej nazwy pliku. TO ZNACZY. bardzo wolno
Kopiuj i wklej

4

Jeśli korzystasz z systemu Windows i nie masz czasu na znalezienie fajnej grepalternatywy, 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).


Jeśli użytkownik może zainstalować awscli za pomocą choco, może zainstalować grep, prawda? Lub użyć natywnego wyszukiwania systemu Windows?
Dean Radcliffe

2

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.

http://aws.amazon.com/cloudsearch/


7
Niezupełnie to, czego szukał OP
Clintm

dla mnie oznaczałoby to zapisanie tam wszystkich danych - powielanie danych
BG Bruno

1

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.


Świetny sposób na wysadzenie przestrzeni magazynowej węzła na dysku EXTFS2 / 3, jeśli masz miliony plików w swoim
zasobniku

1

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.


1

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.


1
Uwaga: --output textokreś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: Keyani tym podobnych.
Matt

1

Spróbowałem w następujący sposób

aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv

Spowoduje to wyświetlenie rzeczywistej ścieżki do miejsca, w którym plik istnieje

2019-04-05 01:18:35     111111 folder1/2019/03/20/filename.csv

1

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'

https://aws.amazon.com/blogs/developer/introducing-support-for-amazon-s3-select-in-the-aws-sdk-for-javascript/

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.


Wydaje się, że nie jest to wykonalne dla żadnej aplikacji, która wymaga intensywnego wyszukiwania, ponieważ koszt jest dość wysoki ...
tnkh

@tnkh Zgadzam się - chciałbym też więcej opcji z # s3
BG Bruno


0

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.


0

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.


0

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

0

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.


0

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).


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.