amazon-web-services #amazon-s3 #boto3
#amazon-web-services #amazon-s3 #boto3
Вопрос:
У меня есть задание, для которого необходимо перенести ~ 150 ГБ из одной папки в другую. Это выполняется один раз в день.
def copy_new_data_to_official_location(bucket_name):
s3 = retrieve_aws_connection('s3')
objects_to_move = s3.list_objects(
Bucket=bucket_name, Prefix='my/prefix/here')
for item in objects_to_move['Contents']:
print(item['Key'])
copy_source = {
'Bucket': bucket_name,
'Key': item['Key']
}
original_key_name = item['Key'].split('/')[2]
s3.copy(copy_source, bucket_name, original_key_name)
У меня следующее. Этот процесс занимает немного времени, а также, если я правильно читаю, я плачу за передачу данных при перемещении между объектами.
Есть ли лучший способ?
Поток:
- Запустите крупномасштабное задание на Spark для ввода данных из folder_1 и внешнего источника
- Скопируйте выходные данные в folder_2
- Удалить все содержимое из folder_1
- Скопируйте содержимое folder_2 в folder_1
Повторите описанный выше поток с ежедневной частотой.
Spark немного странный, поэтому необходимо скопировать выходные данные в folder_2, в противном случае перенаправление в folder_1 приведет к удалению данных еще до запуска задания.
Комментарии:
1. Является ли ваша главная проблема общей продолжительностью процесса копирования? Почему вы выполняете копирование только один раз в день?
Ответ №1:
Плата за передачу данных не взимается, если исходные и целевые корзины находятся в одном регионе. Поскольку вы просто копируете в пределах одной корзины, плата за передачу данных не взимается.
150 ГБ — это не очень много данных, но копирование может занять некоторое время, если объектов много. Накладные расходы на инициализацию копирования иногда могут занимать больше времени, чем фактическое копирование данных. При использовании copy()
команды все данные передаются внутри Amazon S3 — ничего не копируется на компьютер, на котором выдается команда.
Есть несколько способов ускорить процесс:
- Вы могли бы выполнять
copy()
команды параллельно. Фактически, именно так работает интерфейс командной строки AWS (CLI) при использованииaws s3 cp --recursive
andaws s3 sync
. - Вы можете использовать AWS CLI для копирования объектов, а не для написания собственной программы.
- Вместо копирования объектов один раз в день вы можете настроить репликацию в Amazon S3 таким образом, чтобы объекты копировались сразу после их создания. (Хотя я не пробовал это с тем же исходным и целевым сегментами.)
- Если вам нужно более тщательно выбирать объекты для немедленного копирования, вы можете настроить Amazon S3 на запуск функции AWS Lambda всякий раз, когда создается новый объект. Функция Lambda может применить некоторую бизнес-логику, чтобы определить, следует ли копировать объект, а затем она может выдать
copy()
команду.
Комментарии:
1. Привет, Джон, спасибо за отзыв. Я рассмотрю это более подробно утром и проведу более глубокий анализ!