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

时间:2013-10-10 07:55:38

标签: amazon-web-services amazon-s3

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

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

2 个答案:

答案 0 :(得分:26)

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

然而,魔鬼在于细节。 S3的多部分上传API的最小文件部分大小为5MB。因此,如果串联下的一系列文件中的任何文件是< 5MB,它会失败。

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

我的生产代码通过以下方式执行此操作:

  1. 询问要上传的文件清单
  2. 如果第一部分是 在5MB以下,下载件*和缓冲区到磁盘,直到5MB被缓冲。
  3. 按顺序附加部件,直到文件连接完成
  4. 如果非终端文件是< 5MB,附加它,然后完成上传并创建新的上传并继续。
  5. 最后,S3 API中存在一个错误。 ETag(实际上是S3上的任何MD5文件校验和,在多部分上传完成时未正确重新计算。要解决此问题,请在完成时复制罚款。如果在连接期间使用临时位置,则将解决在最后的复制操作上。

    *请注意,您可以下载byte range of a file。这样,如果第1部分为10K,第2部分为5GB,则只需读入5110K即可满足继续所需的5MB大小。

    **您还可以在S3上使用5MB的零块并将其用作默认的起始块。然后,在上载完成后,使用字节范围5MB+1 to EOF-1

    执行文件复制

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

答案 1 :(得分:14)

您可以使用Multipart Upload with Copy合并S3上的对象,而无需下载并再次上传。

您可以在Java,.NET或REST API here中找到一些示例。