Как проверить, идентичны ли два больших файла на amazon S3? - PullRequest
1 голос
/ 11 февраля 2012

Мне нужно переместить большие файлы (> 5 ГБ) на amazon S3 с boto, из одного и того же контейнера.Для этого мне нужно использовать multipart API, который не использует суммы md5 для etags.

Хотя я думаю (ну, конечно, только на 98%), что мой код верен, я хотел бы убедиться, что новая копия не повреждена перед удалением оригинала.Однако я не смог найти никакого метода, кроме как загрузить оба объекта и сравнить их локально, что для файлов объемом более 5 ГБ - довольно длительный процесс.

Для справки ниже приведен мой код для копирования большого файла с помощью 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 байт.

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Вы должны быть в состоянии вычислить хэш SHA-1 для потока данных ( см. Этот поток SO для кода C ++, который может дать подсказки для подхода на языке Python). Перенаправив поток хэшированных данных на эквивалент /dev/null, вы сможете сравнивать хэши SHA-1 двух файлов без предварительной их локальной загрузки.

0 голосов
/ 11 марта 2013

Невозможно сделать то, что вы хотите, не зная, как AWS рассчитывает etag при многоэтапной загрузке.Если у вас есть локальная копия объекта, вы можете вычислить md5 каждой части, которую вы копируете в локальный объект, и сравнить ее с etag в ключе, который возвращает каждый mp.copy_part_from_key ().Похоже, у вас нет локального объекта.

У вас также есть небольшая неочевидная проблема, скрывающаяся в бото, которая может или не может привести к потере данных в очень редком случае.Если вы посмотрите на исходный код boto, то заметите, что функция mp.complete_upload () на самом деле не использует ни один из тегов etags ни для одной из частей, возвращаемых AWS при загрузке.Когда вы используете multipart_complete, он фактически создает совершенно новый составной список и получает новый список деталей и этаг из S3.Это рискованно из-за возможной последовательности, и список может быть, а может и не быть полным.Multipart_complete () в идеале должен использовать etags и информацию о части, которые возвращались каждой удаленной копией, чтобы быть полностью безопасными.Это то, что Amazon рекомендует в своей документации (см. Примечание под Составные списки загрузки ).

Тем не менее, проблема менее вероятна, если вы подтвердите, что размер файла обоих объектов одинаков.Я считаю, что наихудший случай - это то, что деталь не указана в списке многочастной загрузки.Перечисленная часть никогда не должна быть неправильной.

...