2012-02-10 9 views
1

amoto S3のbotoを使用して同じバケットとの間で大きなファイル(> 5GB)を移動する必要があります。このためには、etagsにmd5の合計を使用しないmultipart APIを使用する必要があります。amazon S3で2つの大きなファイルが同じかどうかを確認するにはどうすればいいですか?

私のコードは正しいと思うが(確か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の小さなファイルを2つ使用してテストします。 – istruble

+1

@istruble:うーん、マルチパートは5BM +チャンクでしか動作しません。しかし、私はいくつかのファイルだけをテストすることができ、アマゾン部分にはバグがなく、テストが網羅的であることを願っています。 – ascobol

+0

ありがとうございます。私は今日何か新しいことを学んだ。 – istruble

答えて

1

データストリームでSHA-1ハッシュを計算できるようにする必要があります(C++コードではsee this SO thread、これはPythonアプローチのヒントになる可能性があります)。ハッシュされたデータストリームを/dev/null相当のものにリダイレクトすることにより、SHA-1ハッシュを2つのファイルから最初にローカルにダウンロードすることなく比較することができます。

+0

私はこれがamazon S3でリモートで動作するのではないかと疑います... – ascobol

+0

ハッシュを計算するためにデータをダウンロードしていますが、データは保存していません。任意のプログラムに関する限り、S3はWebリクエストを介してアクセスする別のデータソースです。 –

+0

私は、それはEC2を試してみる時間です:) – ascobol

0

AWSがマルチパートアップロードでのetagの計算方法を知らなくても、あなたがしたいことをする方法はありません。オブジェクトのローカルコピーがある場合は、ローカルオブジェクトでコピーしている各パーツのmd5を計算し、各mp.copy_part_from_key()が返すキーのetagと比較することができます。あなたがローカルオブジェクトを持っていないように思えます。

非常にまれなケースでデータを失う可能性がありますが、そうでない場合もあります。 botoソースコードを見ると、アップロード時にmp.complete_upload()関数が実際にAWTから返された部品のetagsを使用していないことに気づくでしょう。 multipart_completeを使用すると、実際には完全に新しいマルチパートリスト自体が作成され、S3からの新しい部品とエタグのリストが取得されます。最終的な一貫性のためにこれは危険であり、リストは完全であるかもしれない。 multipart_complete()は、理想的には、各リモートコピーによって返されたetagsとパーツ情報を完全に安全に使用する必要があります。これは、Amazonがその文書で推奨しているものです(Multipart Upload Listingsの注を参照)。

つまり、両方のオブジェクトのファイルサイズが同じであることを確認すると、問題は起こりにくくなります。私が考えている最悪のケースは、パートがマルチパートアップロードリストに記載されていないということです。リストされた部分は決してそれ自体が間違ってはならない。

関連する問題