Як шукати відро Amazon s3?


159

У мене відро з тисячами файлів у ньому. Як я можу шукати відро? Чи є інструмент, який ви можете порекомендувати?


У мене є кілька відра, тому я написав короткий сценарій, щоб проглянути
Lauren Fitch

Відповіді:


31

S3 не має власного "пошуку цього відра", оскільки фактичний вміст невідомий - також, оскільки S3 заснований на ключі / значенні, немає рідного способу отримати доступ до багатьох вузлів одночасно, а більше традиційних сховищ даних, які пропонують (SELECT * FROM ... WHERE ...)(у SQL модель).

Вам потрібно буде виконати, ListBucketщоб отримати список об'єктів у відрі, а потім повторити кожен елемент, виконуючи власну операцію, яку ви реалізуєте - це ваш пошук.


42
Це вже не так. Дивіться відповідь rhonda нижче: stackoverflow.com/a/21836343/1101095
Nate

11
Для всіх прихильників вищевказаного коментаря: ОП не вказує, чи хочуть вони шукати назви файлів чи ключовий вміст (наприклад, вміст файлу). Отже відповідь @ rhonda все ще може бути недостатньою. Виявляється, що в кінцевому підсумку це вправа, яка залишається споживачеві, оскільки використання консолі S3 навряд чи доступне для користувачів вашого додатка та загальних користувачів. Це в основному лише для власника відра та / або ролей IAM.
Коді Каулан

Чи є якась служба індексації, наприклад lucene.net, для індексації цих пакетів документів.
Мунавар

Я продовжував повертатися до цієї відповіді і створив інструмент, який допоможе: bucketsearch.net - дозволяє здійснити пошук підстановок тощо
Джон М,

251

Лише зауваження, яке слід додати тут: це вже 3 роки потому, але ця публікація є найкращою в Google, коли ви вводите "Як шукати відро для S3".

Можливо, ви шукаєте щось складніше, але якщо ви приземлилися тут, намагаючись зрозуміти, як просто знайти об’єкт (файл) за назвою, це божевільно просто:

відкрийте відро, виберіть "немає" праворуч і починайте вводити ім'я файлу.

http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html


43
Це саме те, що я шукав. У жахливого дизайну досвіду користувачів є нульові візуальні підказки
Кіт Енцерот

2
Потрібно вибрати файл у відрі, а потім почати вводити текст.
cabe56

30
Ще тільки ми дамо вам пошук за префіксом назви елемента.
Даніель Фліппанс

21
Це абсолютно шалено! Люди говорять про щось праворуч або жовтий ящик, але я нічого не можу знайти. Так само повідомлення "Введіть префікс ...". Як "Search Bucket" не є типовим ?? Це майже так само нерозкрито, як програмне забезпечення Atlassian ...
vegather

40
Ця відповідь все ще актуальна? Я не бачу жодного "" жодного "праворуч", а посилання на документацію у відповіді зараз пересилається на іншу сторінку.
BiscuitBaker

112

Ось короткий і некрасивий спосіб пошуку назв файлів пошуку за допомогою AWS CLI :

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-

1
aws s3 ls s3: // your-bucket --рекурсивний | grep your-search був досить хорошим для мого пошуку, дякую Ейб Воелкер.
людина.2067067

3
Усі відра: aws s3 ls | awk '{print $ 3}' | під час читання рядка; робити ехо $ лінію; aws s3 ls s3: // $ line --рекурсивна | греп ваш пошук; зроблено
Аком

1
те, що вирізано -c 32-, без цього теж не працює пошук
sunil

1
cut -c 32-просто відсікає інформацію про розмітки часу та розмір файлу з виводу, який у моїй системі містить 32 символи. Вам це не потрібно, але якщо ви переносите вихід в іншу команду, можливо, буде зручно мати "чистий" вихід.
Abe Voelker

Підтримка CLI include/exclude. Отже,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Моніш

25

Існують (принаймні) два різних випадки використання, які можна охарактеризувати як "пошук у відрі":

  1. Шукайте щось усередині кожного об'єкта, що зберігається у відрі; це передбачає загальний формат для всіх об'єктів у цьому відрі (скажімо, текстові файли) тощо тощо. Для чогось подібного ви змушені робити те, на що щойно відповів Коді Каулан. Документи AWS S3 мають приклад коду, який показує, як це зробити за допомогою AWS SDK для Java: Клавіші лістингу Використання AWS SDK для Java (там ви також знайдете приклади PHP та C #).

  2. Елемент списку Шукайте щось у клавішах об'єктів, що містяться у цьому відрі; S3 , робить має часткову підтримку для цього, у вигляді префікса дозволяє точні співпадіння + руйнуються матчі після того, як роздільник. Це детальніше пояснюється в Посібнику для розробників AWS S3 . Це дозволяє, наприклад, реалізувати "папки" за допомогою використання в якості об'єктних клавіш чогось подібного

    папка / підпапка / file.txt
    Якщо ви будете дотримуватися цієї конвенції, більшість графічних інтерфейсів S3 (наприклад, консоль AWS) покажуть вам папку вашого відра.


Документи для використання префікса в рубіні
Джеймс

22

AWS випустила нову Службу для запиту відер S3 за допомогою SQL: Amazon Athena https://aws.amazon.com/athena/


2
Так, я розумію ... "Афіна недоступна на Заході США (штат Каліфорнія). Виберіть інший регіон."
Клінтм

2
Це накладні витрати з усім цим SQL-запитом, враховуючи, що я хотів лише grep
Ali Gajani

4
@Clintm - змінитися на us-east-1 (N. Virginia)
slocumro

21

Існує кілька варіантів, жоден з них не є простим повнотекстовим рішенням "один кадр":

  1. Пошук шаблонів імен ключів : пошук клавіш, починаючи з якогось рядка - якщо ви ретельно проектуєте імена ключів, можливо, у вас досить швидке рішення.

  2. Пошукові метадані, приєднані до ключів : під час опублікування файлу в AWS S3 ви можете обробляти вміст, витягувати деяку метаінформацію та додавати цю мета-інформацію у вигляді спеціальних заголовків у ключ. Це дозволяє отримувати ключові імена та заголовки без необхідності отримувати повний вміст. Пошук повинен здійснюватися послідовно, для цього немає варіанту пошуку "sql like". З великими файлами це може заощадити багато мережевого трафіку та часу.

  3. Зберігати метадані на SimpleDB : як попередній пункт, але зі збереженням метаданих у SimpleDB. Тут у вас є sql, як select оператори. У разі великих наборів даних ви можете потрапити на обмеження SimpleDB, яке можна подолати (метадані розділу в декількох доменах SimpleDB), але якщо ви дійсно далеко, вам може знадобитися використовувати інший тип бази даних.

  4. Послідовний повнотекстовий пошук вмісту - обробка всіх ключів одна за одною. Дуже повільно, якщо у вас занадто багато ключів для обробки.

Ми зберігаємо 1440 версій файлу в день (по одній хвилині) протягом декількох років, використовуючи перероблене відро, це легко можливо. Але отримання старшої версії вимагає часу, оскільки послідовно слід переходити до версії. Колись я використовую простий індекс CSV із записами, показуючи час публікації плюс ідентифікатор версії, маючи це, я можу досить швидко перейти до старішої версії.

Як бачите, AWS S3 не розроблений для пошуку в повному обсязі тексту, це проста послуга зберігання даних.


4

Пошук за префіксом у консолі S3

безпосередньо у вікні відра консолі AWS.

введіть тут опис зображення

Скопіюйте потрібні файли за допомогою s3-dist-cp

Якщо у вас є тисячі або мільйони файлів, інший спосіб отримати шукані файли - скопіювати їх в інше місце, використовуючи розподілену копію . Ви запускаєте це на EMR в роботі Hadoop. Прикольна річ у AWS - це те, що вони надають власну версію S3 s3-dist-cp . Це дозволяє групувати потрібні файли, використовуючи регулярний вираз у полі groupBy. Ви можете використовувати це, наприклад, у спеціальному кроці на 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"
    }
]

Здається, вигляд відра консолі AWS не переходить файл за файлом із застосуванням фільтра. Він здатний дуже швидко повертати результати за умови підстроки файлу, який я шукаю. Чи є клієнт / інструмент / API, який я можу використовувати, крім консолі AWS, для отримання результатів в тій же садибі. @ високий6. Раніше я намагався використовувати boto, але найкращим підходом виявилося повторення всього відра із застосуванням критеріїв пошуку до кожного імені файлу. IE. надзвичайно повільно
Скопіюйте та вставте

4

Якщо ви працюєте в Windows і не маєте часу знайти приємну grepальтернативу, швидким і брудним способом було б:

aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt

а потім зробіть швидкий пошук у myfile.txt

Біт "папки" необов'язковий.

PS, якщо у вас не встановлений AWS CLI - ось один вкладиш за допомогою менеджера пакетів Chocolatey

choco install awscli

PPS Якщо у вас немає менеджера пакунків Chocolatey - отримайте його! Ваше життя в Windows покращиться в 10 разів. (Я жодним чином не пов'язаний з Chocolatey, але ей, справді це обов'язково).


Якщо користувач може встановити choco awscli, він може встановити grep, ні? Або використовувати рідну знахідку Windows?
Дін Редкліфф

2

Зважаючи на те, що ви перебуваєте в AWS ... я думаю, ви хочете скористатися їх інструментами CloudSearch. Покладіть дані, які ви хочете шукати, в їх службу ... нехай вони вказують на клавіші S3.

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


7
Не зовсім те, чого шукала ОП
Клінтм

для мене це означатиме збереження там усіх даних - дублювання даних
BG Bruno

1

Ще один варіант - віддзеркалення відра S3 на вашому веб-сервері та обхід локально. Хитрість полягає в тому, що локальні файли порожні та використовуються лише як скелет. Крім того, локальні файли можуть містити корисні метадані, які вам зазвичай потрібно отримати від S3 (наприклад, розмір файлів, mimetype, автор, часова марка, uuid). Коли ви надаєте URL-адресу для завантаження файлу, виконайте пошук на локальному рівні та надайте посилання на S3-адресу.

Локальне пересування файлів є простим, і такий підхід для управління S3 є агностичним мовою. Локальне переміщення файлів також дозволяє уникнути збереження та запитів у базу даних файлів або затримок із здійсненням серії віддалених викликів API для аутентифікації та отримання вмісту відра.

Ви можете дозволити користувачам завантажувати файли безпосередньо на ваш сервер через FTP або HTTP, а потім передавати партію нових та оновлених файлів в Amazon у вихідний час, просто повторюючи каталоги файлів будь-якого розміру. Після завершення передачі файлу в Amazon замініть файл веб-сервера порожнім одним і тим же ім'ям. Якщо локальний файл має будь-який розмір файлів, то подайте його безпосередньо, оскільки його чекає пакетна передача.


Чудовий спосіб вибухнути місце для зберігання вузла на диску EXTFS2 / 3, якщо у вашому S3 відра є мільйони файлів ...
tpartee

1

Як я це зробив: у s3 є тисячі файлів. Я побачив у списку панель властивостей одного файлу. Ви можете бачити URI цього файлу, і я копіюю його, вставивши його в браузер - це був текстовий файл, і він добре відобразився. Тепер я замінив uuid у URL-адресі на uuid, який я мав під рукою, і бум там файл.

Я б хотів, щоб AWS мав кращий спосіб пошуку файлу, але це працювало для мене.


1

Спробуйте цю команду:

aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'

Потім ви можете передати це в греп, щоб отримати конкретні типи файлів, щоб робити з ними все, що завгодно.


1
Примітка. --output textВказує, що на виході буде звичайний текст, а не JSON тощо., А --query 'Contents[].{Key: Key, Size: Size}'лише фільтрує вихідний список у назві та розмірі файлу. Це не шукає Key: Keyтощо.
Метт

1

Я спробував наступним чином

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

Це виводить фактичний шлях, де існує файл

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

1

Це трошки стара тема - але, можливо, допомогти тому, хто все ще шукає - я той, хто шукає цього року.

Рішення може бути " AWS Athena ", де ви можете шукати подібні дані

'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/

В даний час ціна на 1 ТБ становить 5 доларів - так, наприклад, якщо ваш запит на пошук в одному файлі розміром 1 Тб тричі перевищує вашу вартість 15 доларів США, - але, наприклад, якщо у “перетвореному стовпчиковому форматі” є лише 1 стовпець, що ви хочете прочитати, ви заплатите 1 / 3 ціни означає 1,67 дол. / ТБ.


Здається, це не можливо для будь-якої програми, яка потребує інтенсивного пошуку, оскільки вартість досить висока, хоча ...
tnkh

@tnkh Я згоден - я хотів би ще варіантів з # s3
BG Bruno


0

Я зробив щось, як показано нижче, щоб знайти візерунки у своєму відрі

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
  }

Для більших відра це забирає занадто багато часу, оскільки всі підсумки об’єктів повертаються Aws, а не лише ті, що відповідають префіксу та роздільнику. Я шукаю шляхи для підвищення продуктивності, і поки що я виявив, що я повинен називати ключі та правильно їх організовувати у відра.


0

Я зіткнувся з тією ж проблемою. Пошук у S3 повинен бути набагато простішим, ніж поточна ситуація. Тому я реалізував цей інструмент з відкритим кодом для пошуку в S3.

SSEARCH - це повний інструмент пошуку S3 з відкритим кодом. Він був реалізований завжди, маючи на увазі, що продуктивність є найважливішим фактором, і відповідно до еталонів він здійснює пошук у відро, яке містить ~ 1000 файлів протягом декількох секунд.

Установка проста. Ви завантажуєте лише докер-композиційний файл і запускаєте його

docker-compose up

SSEARCH буде запущено, і ви зможете шукати що завгодно у будь-якому відрі.


0

Перемотка вперед до 2020 року, використовуючи aws-okta як наш 2fa, наступна команда, в той час як повільно, як пекло, переглядати всі об'єкти та папки в цьому конкретному відрі (+270 000) спрацювало чудово.

aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt

0

Використовуйте Amazon Athena для запиту відра S3. Крім того, завантажуйте дані в пошук Amazon Elastic. Сподіваюся, це допомагає.


0

Не технічна відповідь, але я створив додаток, який дозволяє шукати підстановку: https://bucketsearch.net/

Це асинхронно індексує ваше відро, а потім дозволить шукати результати.

Це безкоштовно для використання (пожертвування).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.