2017-01-19 14 views
0

Я хочу скопировать ключи из ведер между двумя разными учетными записями, используя boto3 api's. В boto3, я выполнил следующий код и копия работалаparallell копия ведер/ключей из boto3 или boto api между двумя разными учетными записями/соединениями

source = boto3.client('s3') 
destination = boto3.client('s3') 
destination.put_object(source.get_object(Bucket='bucket', Key='key')) 

В основном я Извлечение данных из GET и вставляя, что с PUT на другой счет.

На подобных линиях в Boto апи, я сделал следующее

source = S3Connection() 
source_bucket = source.get_bucket('bucket') 
source_key = Key(source_bucket, key_name) 

destination = S3Connection() 
destination_bucket = destination.get_bucket('bucket') 
dist_key = Key(destination_bucket, source_key.key) 
dist_key.set_contents_from_string(source_key.get_contents_as_string()) 

Приведенный выше код достигает цели копирования данных любого типа. Но скорость действительно очень медленная. Я получаю около 15-20 секунд, чтобы скопировать данные на 1 ГБ. И мне нужно скопировать 100GB плюс. Я попробовал python mutithreading, в котором каждый поток выполняет операцию копирования. Производительность была плохая, так как потребовалось 30 секунд для копирования 1 ГБ. Я подозреваю, что проблема с GIL может быть здесь. Я выполнял многопроцессорную обработку, и получаю тот же результат, что и для одного процесса, т. Е. 15-20 секунд для 1 ГБ файла.

Я использую очень высокий сервер с 48 ядрами и 128 ГБ оперативной памяти. Скорость сети в моей среде составляет 10 ГБ. Большинство результатов поиска рассказывают о копировании данных между ведрами в одной учетной записи, а не через учетные записи. Может ли кто-нибудь направить меня сюда. Является ли мой подход неправильным? У кого-то есть лучшее решение?

ответ

1

Вы должны проверить TransferManager в boto3. Он автоматически обработает многопоточную загрузку многопользовательских загрузок. См. the docs для более подробной информации.

В принципе, вам необходимо использовать метод upload_file, и TransferManager позаботится обо всем остальном.

import boto3 

# Get the service client 
s3 = boto3.client('s3') 

# Upload tmp.txt to bucket-name at key-name 
s3.upload_file("tmp.txt", "bucket-name", "key-name") 
+0

Спасибо за предложение. Я использовал boto3.upload_fileobj() для передачи данных между учетными записями. Для копирования 1 ГБ файла потребовалось 17 секунд. Сгруппируйте код с несколькими процессами и увеличьте количество потоков до 25 в boto3.s3.transfer.TransferConfig в каждом процессе. 1 ГБ скопировано через 9-10 секунд. :) Я играю с параметрами TransferConfig и, надеюсь, 1 ГБ будет скопирован через 5-7 секунд. Cheers – bechkam7

2

Да, это неправильный подход.

Вы не должны скачать файл. Вы используете инфраструктуру AWS, поэтому для выполнения работ вам необходимо использовать эффективный обратный вызов AWS. Ваш подход тратит ресурсы.

boto3.client.copy будет выполнять эту работу лучше, чем это.

Кроме того, вы не описали то, что вы пытаетесь достичь (например, это какое-то требование к репликации?).

Поскольку при правильном понимании ваших собственных потребностей возможно, что вам даже не нужен сервер для выполнения задания: S3 События запуска Bucket, lambda и т. Д. Могут выполнять копирование без сервера.

Чтобы скопировать файл между двумя различными счет AWS, вы можете оформить эту ссылку Copy S3 object between AWS account

Примечание:

S3 представляет собой огромный виртуальный магазин объект для всех, поэтому название Ковш должен быть уникальным. Это также означает, что контроллер S3 «может выполнять много причудливой работы, подобной файловому серверу, например. репликация, копирование, перемещение файла в бэкэнд без привлечения сетевых потоков.

Пока вы настраиваете правильные разрешения/политики IAM для целевого ковша, объект может перемещаться по ведру без дополнительного сервера.

Это почти похоже на файловый сервер. Пользователь может копировать файл друг к другу без «загрузки/выгрузки», вместо этого просто создать папку с правами на запись для всех, копирование файлов с другого пользователя выполняется на файловом сервере с максимальной производительностью исходного ввода-вывода диска. Вам не нужен мощный экземпляр и высокопроизводительная сеть с использованием backend S3 copy API.

Ваш метод аналогичен попытке загрузки файла FTP с пользователя с использованием того же файлового сервера, который создает нежелательные сетевые трафики.

+0

Если ваша проблема связана с копированием файлов на S3, это правильный ответ. Я неправильно понял вашу проблему и подумал, что вы просто искали способы увеличить пропускную способность при передаче в/из S3. Для этого попробуйте TransferManager. – garnaat

+0

Я хочу скопировать данные из одной системы в другую только по протоколу S3. Вчера я нашел лучшее решение, в котором я использую метод boto3.upload_fileobj(). – bechkam7

+0

@ bechkam7: это не помогает в производительности, если вы продолжаете выполнять эту передачу данных «загрузка/загрузка сети». В пределах одной и той же области S3 даже другой владелец ведра способен копировать/перемещать данные между ведром без каких-либо сетевых потоков, если вы настраиваете правильные роли IAM и разрешения для целевого ковша. – mootmoot