У меня есть ведро с тысячами файлов в нем. Как я могу искать ведро? Есть ли инструмент, который вы можете порекомендовать?
У меня есть ведро с тысячами файлов в нем. Как я могу искать ведро? Есть ли инструмент, который вы можете порекомендовать?
Ответы:
S3 не имеет встроенного «поиска в этом сегменте», поскольку фактическое содержимое неизвестно - также, поскольку S3 основано на ключах / значениях, нет собственного способа получить доступ ко многим узлам одновременно, а более традиционным хранилищам данных, которые предлагают (SELECT * FROM ... WHERE ...)
(в SQL) модель).
Что вам нужно будет сделать, это выполнить, ListBucket
чтобы получить список объектов в корзине, а затем выполнить итерацию по каждому элементу, выполняя пользовательскую операцию, которую вы реализуете - это ваш поиск.
Просто примечание, которое можно добавить здесь: это сейчас 3 года спустя, но этот пост занимает первое место в Google, когда вы набираете «Как искать S3 Bucket».
Возможно, вы ищете что-то более сложное, но если вы попали сюда, пытаясь выяснить, как просто найти объект (файл) по его названию, это безумно просто:
откройте ведро, выберите «нет» с правой стороны и начните вводить имя файла.
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
Вот краткий и уродливый способ поиска по именам файлов с помощью интерфейса командной строки AWS :
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
cut -c 32-
просто отсекает временную метку и информацию о размере файла из вывода, который в моей системе занимает 32 символа. Вам это не нужно, но если вы передаете вывод в другую команду, может быть полезно иметь «чистый» вывод.
include/exclude
. Итак,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Существует (как минимум) два разных варианта использования, которые можно описать как «поиск в корзине»:
Ищите что-то внутри каждого объекта, хранящегося в ведре; это предполагает общий формат для всех объектов в этом сегменте (скажем, текстовых файлов) и т. д. и т. д. Для чего-то подобного вы вынуждены делать то, что только что ответил Коди Коглан. Документы AWS S3 содержат пример кода, показывающего, как это сделать с помощью AWS SDK для Java: перечисление ключей с помощью AWS SDK для Java (там вы также найдете примеры PHP и C #).
Элемент списка Поиск чего-либо в ключах объекта, содержащихся в этом сегменте; S3 , делает имеет частичную поддержку для этого, в виде префикса позволяет точные совпадения + рушатся матчи после того, как разделитель. Это объясняется более подробно на Руководстве для разработчиков AWS S3 . Это позволяет, например, реализовать «папки», используя в качестве ключей объекта что-то вроде
папка / подпапка / file.txtЕсли вы будете следовать этому соглашению, большинство графических интерфейсов S3 (таких как Консоль AWS) покажет вам представление вашей корзины в виде папки.
AWS выпустил новый сервис для запроса сегментов S3 с помощью SQL: Amazon Athena https://aws.amazon.com/athena/
Есть несколько вариантов, ни один из которых не является простым полнотекстовым решением «один выстрел»:
Поиск по шаблону имени ключа : Поиск ключей, начинающихся с некоторой строки - если вы тщательно продумываете имена ключей, у вас может быть довольно быстрое решение
Поиск метаданных, прикрепленных к ключам : при публикации файла в AWS S3 вы можете обрабатывать содержимое, извлекать некоторую мета-информацию и прикреплять эту мета-информацию в виде пользовательских заголовков к ключу. Это позволяет извлекать ключевые имена и заголовки без необходимости извлечения полного содержимого. Поиск должен быть выполнен последовательно, для этого не существует опции поиска "sql like". С большими файлами это может сэкономить много сетевого трафика и времени.
Сохранение метаданных в SimpleDB : как и в предыдущем пункте, но с сохранением метаданных в SimpleDB. Здесь у вас есть sql как операторы select. В случае больших наборов данных вы можете достичь пределов SimpleDB, которые могут быть преодолены (разделить метаданные на несколько доменов SimpleDB), но если вы зайдете очень далеко, вам может понадобиться использовать другой тип базы данных metedata.
Последовательный полнотекстовый поиск контента - обработка всех ключей по одному. Очень медленно, если у вас слишком много ключей для обработки.
Мы храним 1440 версий файла в день (по одной в минуту) в течение нескольких лет, используя ведро с версиями, это легко возможно. Но получение более старой версии требует времени, поскольку нужно последовательно переходить от версии к версии. Иногда я использую простой CSV-индекс с записями, показывающими время публикации плюс идентификатор версии, имея это, я могу довольно быстро перейти к более старой версии.
Как видите, AWS S3 не предназначен для полнотекстового поиска, это простой сервис хранения.
непосредственно в представлении консоли AWS.
Если у вас есть тысячи или миллионы файлов, другой способ получить нужные файлы - скопировать их в другое место с помощью распределенной копии . Вы запускаете это на EMR в Hadoop Job. Крутая вещь в 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"
}
]
Если вы работаете в 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, но на самом деле это просто необходимо).
Учитывая, что вы находитесь в AWS ... Я думаю, вы захотите использовать их инструменты CloudSearch. Поместите данные, которые вы хотите найти, в их службу ... пусть они указывают на клавиши S3.
Другой вариант - отразить ведро S3 на вашем веб-сервере и пройти локально. Хитрость в том, что локальные файлы пусты и используются только в качестве каркаса. В качестве альтернативы, локальные файлы могут содержать полезные метаданные, которые вы обычно должны получать из S3 (например, размер файла, mimetype, author, timestamp, uuid). Когда вы предоставляете URL для загрузки файла, выполняйте локальный поиск и указывайте ссылку на адрес S3.
Локальный обход файлов прост, и этот подход к управлению S3 не зависит от языка. Локальный обход файлов также позволяет избежать обслуживания и запросов к базе данных файлов или задержек при выполнении серии удаленных вызовов API для аутентификации и получения содержимого корзины.
Вы можете разрешить пользователям загружать файлы непосредственно на ваш сервер через FTP или HTTP, а затем передавать пакет новых и обновленных файлов в Amazon в непиковое время, просто возвращаясь к каталогам для файлов любого размера. По завершении передачи файла в Amazon замените файл веб-сервера на пустой файл с тем же именем. Если локальный файл имеет какой-либо размер файла, подайте его напрямую, поскольку он ожидает пакетной передачи.
Я так и сделал: у меня тысячи файлов в s3. Я видел панель свойств одного файла в списке. Вы можете увидеть URI этого файла, и я скопировал и вставил его в браузер - это был текстовый файл, и он хорошо отображался. Теперь я заменил uuid в url на uuid, который был у меня под рукой, и бум там файл.
Хотелось бы, чтобы у AWS был лучший способ поиска файла, но это сработало для меня.
Попробуйте эту команду:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
Затем вы можете передать это в grep, чтобы заставить определенные типы файлов делать с ними что угодно.
--output text
указывает, что выводом будет простой текст, а не JSON и т. Д., И --query 'Contents[].{Key: Key, Size: Size}'
просто фильтрует вывод списка по имени и размеру файла. Он не ищет Key: Key
или тому подобное.
Это немного старая ветка - но, возможно, поможет кто-то, кто все еще ищет - я тот, кто ищет это год.
Решением может быть « AWS Athena », где вы можете искать по таким данным
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
В настоящее время цена составляет 1 долл. США за данные объемом 1 ТБ. Например, если при поиске по одному файлу объемом 1 ТБ в три раза стоимость составляет 15 долл. США, но, например, если в «преобразованном столбчатом формате» есть только 1 столбец, который вы хотите прочитать, вы заплатите 1 / 3 цены означает $ 1,67 / ТБ.
Взгляните на эту документацию: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Вы можете использовать Perl-совместимое регулярное выражение (PCRE) для фильтрации имен.
Я сделал что-то, как показано ниже, чтобы найти шаблоны в моем ведре
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 возвращает все сводки объектов, а не только те, которые соответствуют префиксу и разделителю. Я ищу способы улучшить производительность, и до сих пор я обнаружил, что я должен называть ключи и правильно организовывать их в сегменты.
Я столкнулся с той же проблемой. Поиск в S3 должен быть намного проще, чем в текущей ситуации. Вот почему я реализовал этот инструмент с открытым исходным кодом для поиска в S3.
SSEARCH - это полностью открытый инструмент поиска S3. Он был реализован всегда с учетом того, что производительность является критическим фактором, и в соответствии с эталонными показателями он выполняет поиск в сегменте, который содержит ~ 1000 файлов в течение нескольких секунд.
Установка проста. Вы загружаете только файл docker-compose и запускаете его с
docker-compose up
Будет запущен SSEARCH, и вы сможете искать что угодно в любом вашем ведре.
Перейдем к 2020 году, и с помощью aws-okta в качестве нашей 2fa, следующей команды, хотя и медленно, чтобы перебрать все объекты и папки в этом конкретном сегменте (+270 000), все работало нормально.
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
Используйте Amazon Athena для запроса корзины S3. Также загрузите данные в поиск Amazon Elastic. Надеюсь это поможет.
Не технический ответ, но я создал приложение, которое позволяет выполнять поиск по шаблону: https://bucketsearch.net/
Он будет асинхронно индексировать ваше ведро, а затем позволит вам искать результаты.
Это бесплатно для использования (donationware).
Статус 2018-07: у Amazon действительно есть собственный sql, такой как поиск файлов CSV и JSON!