我有一些文件正在上传到S3并处理一些Redshift任务。完成该任务后,需要合并这些文件。目前我正在删除这些文件并再次上传合并文件。 这些占用了大量带宽。有没有办法直接在S3上合并文件?
我正在使用Apache Camel进行路由。
答案 0 :(得分:26)
S3允许您使用S3文件URI作为复制操作的源。结合S3的多部件上传API,您可以为多部分上传提供多个S3对象URI as the sources keys。
然而,魔鬼在于细节。 S3的多部分上传API的最小文件部分大小为5MB。因此,如果串联下的一系列文件中的任何文件是< 5MB,它会失败。
但是,你可以通过利用允许最终上传片段的循环孔来解决这个问题。 5MB(允许,因为这在现实世界中发生在上传剩余部分时)。
我的生产代码通过以下方式执行此操作:
最后,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中找到一些示例。