2012-02-10 3 views
1

boto가있는 amazon S3에서 대용량 파일 (> 5GB)을 동일한 버킷 사이에서 이동해야합니다. 이를 위해 etags에 md5 sum을 사용하지 않는 multipart API를 사용해야합니다.amazon S3에서 두 개의 큰 파일이 동일한 지 확인하는 방법은 무엇입니까?

내 코드가 맞다고 생각하지만 (물론 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 바이트에서만 작동합니다.

+0

두 개의 작은 ~ 1kB 파일로 테스트하십시오. – istruble

+1

@istruble : 잘, multipart는 5BM + 청크에서만 작동합니다. 하지만 여전히 몇 가지 파일에 대해서만 테스트 할 수 있으며 아마존 부분에는 버그가없고 테스트가 철저하다는 희망이 있습니다. – ascobol

+0

감사합니다. 나는 오늘 새로운 것을 배웠다. – istruble

답변

1

데이터 스트림에서 SHA-1 해시를 계산할 수 있어야합니다 (파이썬 접근에 대한 힌트를 줄 수있는 C++ 코드의 경우 see this SO thread). 해시 된 데이터 스트림을 /dev/null에 해당하는 것으로 리디렉션하면 두 파일의 SHA-1 해시를 먼저 로컬에서 다운로드하지 않고도 비교할 수 있습니다.

+0

아마존 S3가 원격으로 작동하는 것을 의심합니다 ... – ascobol

+0

해시를 계산하기 위해 데이터를 다운로드하고 있지만 데이터는 저장하지 않았습니다. 주어진 프로그램에 관한 한, S3은 웹 요청을 통해 액세스되는 또 다른 데이터 소스 일뿐입니다. –

+0

나는 EC2를 시도 할 시간이다. :) – ascobol

0

AWS가 멀티 파트 업로드에서 etag를 계산하는 방법을 알지 못하면 원하는 것을 할 방법이 없습니다. 객체의 로컬 복사본이있는 경우 로컬 객체에 복사 할 각 파트의 md5를 계산하고 각 mp.copy_part_from_key()가 반환하는 키의 etag와 비교할 수 있습니다. 그래도 로컬 객체가없는 것처럼 들립니다.

아주 드물게 데이터를 잃을 수도 있고 그렇지 않을 수도있는 boto에 숨겨진 작은 명백한 문제가 있습니다. boto 소스 코드를 보면 mp.complete_upload() 함수가 실제로 업로드 할 때 AWS에서 반환 한 부분에 etags를 사용하지 않는다는 것을 알 수 있습니다. multipart_complete를 사용하면 실제로 완전히 새로운 다중 파트 목록 자체를 수행하고 S3에서 새 부품 목록 및 etags를 가져옵니다. 최종 일관성 때문에 위험하며 목록이 완전하거나 아닐 수도 있습니다. multipart_complete()는 완벽하게 안전하기 위해 각 원격 복사본에 의해 반환 된 etags 및 부품 정보를 이상적으로 사용해야합니다. 이것이 아마존의 설명서에서 권장하는 바입니다 (Multipart Upload Listings 아래 참고 참조).

즉, 두 개체의 파일 크기를 동일하게 설정하면 문제가 발생할 가능성이 적습니다. 내가 믿는 최악의 경우는 부분이 멀티 파트 업로드 목록에 나열되어 있지 않다는 것입니다. 목록에있는 부분이 잘못해서는 안됩니다.