合并AWS S3上的文件(使用Apache Camel)

Sum*_*ava 14 amazon-s3 amazon-web-services

我有一些文件正在上传到S3并处理一些Redshift任务.完成该任务后,需要合并这些文件.目前我正在删除这些文件并再次上传合并文件.这些占用了大量带宽.有没有办法直接在S3上合并文件?

我正在使用Apache Camel进行路由.

Jos*_*ust 26

S3允许您使用S3文件URI作为复制操作的源.结合S3的多部件上传API,您可以提供多个S3对象URI 作为多部分上载的源键.

然而,魔鬼在细节中.S3的多部分上传API的最小文件部分大小为5MB.因此,如果连接下的一系列文件中的任何文件小于5MB,则它将失败.

但是,你可以通过利用循环漏洞来解决这个问题,这个循环漏洞允许最终上传部分<5MB(允许因为这在现实世界中发生,当上传剩余部分时).

我的生产代码是这样做的:

  1. 询问要上传的文件的清单
  2. 如果第一部分低于5MB,则将片段*和缓冲区下载到磁盘,直到缓冲5MB.
  3. 按顺序附加部件,直到文件串联完成
  4. 如果非终端文件<5MB,请将其附加,然后完成上载并创建新上载并继续.

最后,S3 API中存在一个错误.ETag(实际上是S3上的任何MD5文件校验和,在多部分上传完成时未正确重新计算.要解决此问题,请在完成时复制罚款.如果在连接期间使用临时位置,则将解决在最后的复制操作上.

*请注意,您可以下载文件的字节范围.这样,如果第1部分为10K,第2部分为5GB,则只需读入5110K即可满足继续所需的5MB大小.

**您还可以在S3上使用5MB的零块并将其用作默认的起始块.然后,当上载完成时,使用字节范围执行文件复制5MB+1 to EOF-1

PS当我有时间制作这段代码的要点时,我会在这里发布链接.


小智 14

您可以使用Multipart Upload with Copy在S3上合并对象,而无需再下载和上传它们.

你可以在Java中,NET或与REST API一些例子在这里.