Как вы ищете ведро amazon s3?



У меня есть ведро с тысячами файлов в нем. Как я могу обыскать ведро? Есть ли инструмент, который вы можете порекомендовать?

641   14  

14 ответов:

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

то, что вам нужно будет сделать, это выполнить ListBucket чтобы получить список объектов в корзине, а затем перебирать каждый элемент, выполняющий пользовательскую операцию, которую вы реализуете - это ваш поиск.

просто Примечание, чтобы добавить здесь: это теперь 3 года спустя, но этот пост является лучшим в Google, когда вы вводите "как искать ведро S3."

возможно, вы ищете что-то более сложное, но если вы приземлились здесь, пытаясь понять, как просто найти объект (файл) по его названию, это безумно просто:

откройте ведро, выберите " Нет " с правой стороны и начните вводить имя файла.

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

вот короткий и уродливый способ сделать поиск имен файлов с помощью AWS CLI:

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

есть (по крайней мере) два разных варианта использования, которые можно описать как "поиск в ведре":

  1. искать что-то внутри каждый объект, хранящийся в ведре; это предполагает общий формат для всех объектов в этом ведре (скажем, текстовые файлы) и т. д. Для чего-то вроде этого вы вынуждены делать то, что только что ответил Коди Коулан. В документах AWS S3 есть пример кода, показывающий, как это сделать с помощью AWS SDK для Java: Список Ключей С Помощью AWS SDK для Java (там вы также найдете примеры PHP и C#).

  2. поиск элемента списка для чего-то в объекте ключи содержится в этом ведре; S3 тут есть частичная поддержка этого, в виде разрешения префикса точные совпадения + сворачивание совпадений после разделителя. Это объясняется более подробно на AWS S3 руководство для разработчиков. Это позволяет, например, реализовать "папки" через используя в качестве ключей объекта что-то вроде

    folder/subfolder/file.txt
    Если вы будете следовать этому соглашению, большинство графических интерфейсов S3 (например, консоль AWS) покажет вам представление папки вашего ведра.

есть несколько вариантов, ни один из которых не является простым" одним выстрелом " полнотекстовое решение:

  1. Key name pattern search: поиск ключей, начиная с некоторой строки - Если вы тщательно разрабатываете имена ключей, то у вас может быть довольно быстрое решение.

  2. Поиск метаданных, прикрепленных к ключам: при публикации файла в AWS S3 вы можете обработать содержимое, извлечь некоторую метаинформацию и прикрепить эту метаинформацию в форме пользовательских заголовков в ключ. Это позволяет извлекать имена ключей и заголовки без необходимости извлечения полного содержимого. Поиск должен выполняться последовательно, для этого нет опции поиска" sql like". С большими файлами это может сэкономить много трафика и времени.

  3. хранить метаданные на SimpleDB: как и в предыдущем пункте, но с сохранением метаданных на SimpleDB. Здесь у вас есть SQL, как select операторы. В случае больших наборов данных, вы можете нажать Ограничения SimpleDB, которые могут быть преодолены (метаданные разделов между несколькими доменами SimpleDB), но если вы заходите очень далеко, вам может потребоваться использовать другой тип базы данных metedata.

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

мы храним 1440 версий файла в день (один в минуту) в течение нескольких лет, используя версионное ведро, оно это легко возможно. Но получение более старой версии требует времени, так как нужно последовательно переходить от версии к версии. Иногда я использую простой индекс CSV с записями, показывая время публикации плюс идентификатор версии, имея это, я мог бы перейти к более старой версии довольно быстро.

Как вы видите, AWS S3 не сам по себе предназначен для полнотекстового поиска, это простой сервис хранения.

AWS выпустила новый сервис для запроса ведер S3 с SQL: Amazon Athena https://aws.amazon.com/athena/

учитывая, что вы находитесь в AWS...Я бы подумал, что вы захотите использовать их инструменты CloudSearch. Поместите данные, которые вы хотите найти в их сервисе...пусть он указывает на ключи S3.

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

поиск по префиксу в консоли S3

непосредственно в представлении ведра консоли AWS.

enter image description here

копировать нужные файлы с помощью 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"
    }
]

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

локальный обход файлов прост, и этот подход для S3 управление-это язык агностиков. Локальный обход файлов также позволяет избежать ведения и запроса базы данных файлов или задержки выполнения серии удаленных вызовов API для проверки подлинности и получения содержимого корзины.

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

попробуйте эту команду:

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

затем вы можете передать это в grep, чтобы получить определенные типы файлов, чтобы делать с ними все, что вы хотите.

взгляните на эту документацию: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list

вы можете использовать Perl-совместимое регулярное выражение (PCRE) для фильтрации имен.

то, как я это сделал: У меня есть тысячи файлов в s3. Я видел панель свойств одного файла в списке. Вы можете увидеть URI этого файла, и я скопировал его в браузер - это был текстовый файл, и он хорошо отображался. Теперь Я заменил uuid в url на uuid, который у меня был под рукой, и бум там файл.

Я хотел бы, чтобы AWS имел лучший способ поиска файла, но это сработало для меня.

Я сделал что-то, как показано ниже, чтобы найти шаблоны в моем ведре

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, а не только те, которые соответствуют префиксу и разделителю. Я ищу способы улучшить производительность, и до сих пор я только нашел, что я должен назвать ключи и правильно организовать их в ведрах.

статус 2018-07: У Amazon есть собственный sql, такой как поиск файлов csv и json!

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

Comments

    Ничего не найдено.