AWS S3: загрузка большого файла из ec2 в s3 не удалась - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь загрузить большие файлы из экземпляра ec2 в aws s3.Я использую загрузку нескольких частей Python для загрузки файлов в S3.Он успешно выполняется, когда я получаю файлы размером около 40 ГБ, но когда я получаю файлы размером более 70 ГБ, код завершается ошибкой после загрузки около 20%.Я прилагаю свой код и сообщение об ошибке ниже:

import threading
import boto3
import os
import sys
from boto3.s3.transfer import TransferConfig

s3 = boto3.resource('s3')

local_fs_path=sys.argv[1]
subject_area=sys.argv[2]
py_file=sys.argv[3]
s3_path=sys.argv[4]

BUCKET_NAME = "***********"
def multi_part_upload_with_s3():
    # Multipart upload
    config = TransferConfig(multipart_threshold=1024 * 5, max_concurrency=10,
                            multipart_chunksize=1024 * 5, use_threads=True)
    file_path = os.path.dirname(local_fs_path) + '/' + py_file
    key_path = s3_path + '/' + subject_area + '/' +  py_file
    s3.meta.client.upload_file(file_path, BUCKET_NAME, key_path,
                            ExtraArgs={'ACL': 'public-read'},
                            Config=config,
                            Callback=ProgressPercentage(file_path)
                            )
class ProgressPercentage(object):
    def __init__(self, filename):
        self._filename = filename
        self._size = float(os.path.getsize(filename))
        self._seen_so_far = 0
        self._lock = threading.Lock()
    def __call__(self, bytes_amount):
        # To simplify we'll assume this is hooked up
        # to a single filename.
        with self._lock:
            self._seen_so_far += bytes_amount
            percentage = (self._seen_so_far / self._size) * 100
            sys.stdout.write(
                "\r%s  %s / %s  (%.2f%%)" % (
                    self._filename, self._seen_so_far, self._size,
                    percentage))
            sys.stdout.flush()

if __name__ == '__main__':
   multi_part_upload_with_s3()

Сообщение об ошибке, которое я получаю, выглядит так:

  /home/*****/etl/******/*******/*******/*********/***.20190510.dat  13080289280 / 88378295325.0  (14.80%)Traceback (most recent call last):
  File "/home/*****/etl/******/*******/*******/*********/multipart_load.py", line 46, in <module>
    multi_part_upload_with_s3()
  File "/home/*****/etl/******/*******/*******/*********/multipart_load.py", line 25, in multi_part_upload_with_s3
    Callback=ProgressPercentage(file_path)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/inject.py", line 131, in upload_file
    extra_args=ExtraArgs, callback=Callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 287, in upload_file
    filename, '/'.join([bucket, key]), e))
boto3.exceptions.S3UploadFailedError: Failed to upload /home/*****/etl/******/*******/*******/*********/********.20190510.dat to aws_bucket_name/******/*****/temp_dir/*******.20190510.dat: An error occurred (RequestTimeout) when calling the UploadPart operation (reached max retries: 4): Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...