Объединение файлов на AWS S3 (с использованием Apache Camel)

У меня есть файлы, которые загружаются на S3 и обрабатываются для некоторых задач Redshift. После завершения этой задачи эти файлы необходимо объединить. В настоящее время я удаляю эти файлы и снова загружаю объединенные файлы. Они питаются большой полосой пропускания. Есть ли способ, которым файлы могут быть объединены непосредственно на S3?

Я использую Apache Camel для маршрутизации.

Ответ 1

S3 позволяет использовать URI файла S3 в качестве источника для операции копирования. В сочетании с API загрузки Multi-Part S3 вы можете предоставить несколько URI объектов S3 в качестве ключей источников для многочастной загрузки.

Однако дьявол находится в деталях. API-интерфейс многосайтовой загрузки S3 имеет минимальный размер файловой части 5 МБ. Таким образом, если какой-либо файл в серии файлов под конкатенацией равен < 5MB, он потерпит неудачу.

Тем не менее, вы можете обойти это, используя отверстие в петле, которое позволяет конечному загружаемому фрагменту быть < 5MB (разрешено, потому что это происходит в реальном мире при загрузке остатков).

Мой производственный код делает это:

  • Опрос манифеста загружаемых файлов
  • Если первая часть до 5 МБ, загружать кусочки * и буфера на диск, пока не будет буферизировано 5 МБ.
  • Добавлять части последовательно до завершения конкатенации файлов
  • Если не-конечный файл равен < 5MB, добавьте его, затем завершите загрузку и создайте новую загрузку и продолжите.

Наконец, в S3 API есть ошибка. ETag (на самом деле любая контрольная сумма MD5 файла на S3 неправильно пересчитана по завершении многочастной загрузки.Чтобы исправить это, скопируйте штраф по завершении. Если вы используете временное местоположение во время конкатенации, это будет разрешено на заключительной операции копирования.

* Обратите внимание, что вы можете загрузить диапазон байтов файла. Таким образом, если часть 1 составляет 10K, а часть 2 - 5 ГБ, вам нужно прочитать только 5110K, чтобы получить 5MB-размер, необходимый для продолжения.

** У вас также может быть блок нулей на 5 Мбайт на S3 и использовать его как отправную точку по умолчанию. Затем, когда загрузка будет завершена, сделайте копию файла, используя диапазон байтов 5MB+1 to EOF-1

P.S. Когда у меня будет время сделать Gist этого кода, я отправлю ссылку здесь.

Ответ 2

Вы можете использовать Multipart Upload with Copy, чтобы объединить объекты на S3, не загружая и не загружая их снова.

Вы можете найти несколько примеров в Java,.NET или с помощью REST API здесь.

Ответ 3

S3 - это хранилище объектов, а не хранилище блоков. Вы должны получить объект (ы), прежде чем сможете манипулировать им/им.

Итак, ответ таков: Нет. Вы не можете напрямую объединять файлы на S3.