【问题标题】:How to check if two large files are identical on amazon S3?如何检查亚马逊 S3 上的两个大文件是否相同?
【发布时间】:2013-03-11 10:43:35
【问题描述】:

我需要使用 boto 将亚马逊 S3 上的大文件 (>5GB) 从同一个存储桶移入和移至同一个存储桶。为此,我需要使用 multipart API,它不对 etag 使用 md5 和。

虽然我认为(只有 98% 肯定)我的代码是正确的,但我想在删除原始代码之前验证新副本没有损坏。但是,除了下载这两个对象并在本地比较它们之外,我找不到任何方法,对于 5GB 以上的文件来说,这是一个相当长的过程。

为了记录,下面是我用 boto 复制大文件的代码,也许这可以帮助某人。如果我的问题没有好的解决方案,也许有人会发现错误并阻止我破坏数据。

import boto

copy_size = 1000000000  #1e9
bucket_name = 'mybucket'
orig_key_name = 'ABigFile'
dest_key_name = 'ABigFile.clone'

s3 = boto.connect_s3()
mybucket = s3.get_bucket(bucket_name)

key = mybucket.get_key(orig_key_name)

mp = mybucket.initiate_multipart_upload(dest_key_name)  #keyname

print 'key size: ', key.size

count = 1 
start = 0
end = -1

while end < key.size-1:
   print 'count: ', count
   start = end + 1 
   end = min( key.size -1 , start + copy_size )
   mp.copy_part_from_key(bucket_name, orig_key_name, count , start, end )
   count+=1

mp.complete_upload()

此代码仅适用于原始密钥大小 >= 5368709121 字节。

【问题讨论】:

  • 用两个约 1kB 的小文件进行测试。
  • @istruble:好吧,multipart 仅适用于 5BM+ 块。但是,我仍然只能测试几个文件,并希望亚马逊部分没有任何错误,并且我的测试很详尽。
  • 谢谢。我今天学到了一些新东西。

标签: python amazon-s3 large-files multipart boto


【解决方案1】:

您应该能够在数据流上计算 SHA-1 哈希(see this SO thread 用于 C++ 代码,它可以为 python 方法提供提示)。通过将散列数据流重定向到 /dev/null 的等效项,您应该能够比较两个文件的 SHA-1 散列,而无需先在本地下载它们。

【讨论】:

  • 您只是下载数据来计算哈希,而不是存储数据。就任何给定程序而言,S3 只是另一个数据源,可通过 Web 请求访问。
  • 我明白了,是时候试试 EC2 了 :)
【解决方案2】:

如果不知道 AWS 如何计算分段上传的 etag,就无法做你想做的事。如果您有对象的本地副本,则可以计算您在本地对象上复制的每个部分的 md5,并将其与每个 mp.copy_part_from_key() 返回的键中的 etag 进行比较。听起来你没有本地对象。

您还有一个隐藏在 boto 中的不明显的小问题,在极少数情况下可能会或可能不会导致您丢失数据。如果您查看 boto 源代码,您会注意到 mp.complete_upload() 函数实际上不使用任何 etag 用于上传时 AWS 返回的任何部分。当您使用 multipart_complete 时,它​​实际上会自己创建一个全新的多部分列表,并从 S3 获取新的部件和 etag 列表。由于最终的一致性,这是有风险的,并且该列表可能不完整,也可能不完整。理想情况下,multipart_complete() 应该使用每个远程副本返回的 etags 和部分信息,以确保完全安全。这是亚马逊在其文档中推荐的内容(参见Multipart Upload Listings 下的注释)。

也就是说,如果您确认两个对象的文件大小相同,则不太可能出现问题。我认为最坏的情况是分段上传列表中没有列出某个部分。列出的部分本身绝不能不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多