Есть ли в любом случае, чтобы записать небольшой файл в S3 в режиме реального времени - PullRequest
0 голосов
/ 27 ноября 2018

Я получаю 20 КБ небольших XML-файлов размером от 1 КБ до 3 КБ в минуту.Мне нужно записать все файлы по мере поступления в каталог.

Иногда скорость входящих файлов увеличивается до 100 КБ в минуту.Есть ли что-нибудь в java или aws api, которое может помочь мне соответствовать скорости входящего?

Я использую uploadFileList() API для загрузки всех файлов.Я также пробовал смотреть событие, чтобы при поступлении файлов в папку он загружал этот файл в S3, но это было слишком медленно по сравнению с входящими файлами и создавало огромное количество невыполненных заданий.

Я пробовал многопоточностьтакже, но если я раскручиваю больше потока, я получаю ошибку от S3 reduce you request rate error., и иногда я получаю ошибку ниже также

AmazonServiceException: com.amazonaws.services.s3.model.AmazonS3Exception: Ваше соединение сокетана сервер не был прочитан или записан в течение периода ожидания.Свободные соединения будут закрыты.

, но когда я не использую многопоточность, я не получаю эту ошибку

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

Я знаю, что загрузка небольших файлов в S3 не подходитно у меня есть такой пример использования.

Скорость, которую я заметил, равна 5k загрузки файлов за минуты.

Может кто-нибудь предложить какой-нибудь альтернативный способ, чтобы моя скорость загрузки файлов увеличилась минимум на 15kв минуту.

Я делюсь своим полным кодом, где я пытаюсь загрузить, используя многопоточное приложение

Первый класс, где я создаю файл для добавления в поток

public class FileProcessThreads {

    public  ArrayList process(String fileLocation)  {

        File dir = new File(fileLocation);
        File[] directoryListing = dir.listFiles();
        ArrayList<File> files = new ArrayList<File>();
        if (directoryListing.length > 0) {
            for (File path : directoryListing) {
                files.add(path);
            }
        }
        return files;
    }
}

Класс 2, где я создаю пул потоков и Исполнитель

public class UploadExecutor {
private static String fileLocation = "C:\\Users\\u6034690\\Desktop\\ONEFILE";
// private static String fileLocation="D:\\TRFAudits_Moved\\";
private static final String _logFileName = "s3FileUploader.log";
private static Logger _logger = Logger.getLogger(UploadExecutor.class);

@SuppressWarnings("unchecked")
public static void main(String[] args) {
    _logger.info("----------Stating application's  main method----------------- ");
    AWSCredentials credential = new ProfileCredentialsProvider("TRFAuditability-Prod-ServiceUser").getCredentials();
    final ClientConfiguration config = new ClientConfiguration();

    AmazonS3Client s3Client = (AmazonS3Client) AmazonS3ClientBuilder.standard().withRegion("us-east-1")
            .withCredentials(new AWSStaticCredentialsProvider(credential)).withForceGlobalBucketAccessEnabled(true)
            .build();

    s3Client.getClientConfiguration().setMaxConnections(100);

    TransferManager tm = new TransferManager(s3Client);
    while (true) {
        FileProcessThreads fp = new FileProcessThreads();
        List<File> records = fp.process(fileLocation);
        while (records.size() <= 0) {
            try {
                _logger.info("No records found willl wait for 10 Seconds");
                TimeUnit.SECONDS.sleep(10);
                records = fp.process(fileLocation);
            } catch (InterruptedException e) {
                _logger.error("InterruptedException: " + e.toString());
            }
        }
        _logger.info("Total no of Audit files = " + records.size());
        ExecutorService es = Executors.newFixedThreadPool(2);
        int recordsInEachThread = (int) (records.size() / 2);
        _logger.info("No of records in each thread = " + recordsInEachThread);
        UploadObject my1 = new UploadObject(records.subList(0, recordsInEachThread), tm);
        UploadObject my2 = new UploadObject(records.subList(recordsInEachThread, records.size()), tm);

        es.execute(my1);
        es.execute(my2);
        es.shutdown();
        try {
            boolean finshed = es.awaitTermination(1, TimeUnit.MINUTES);
            if (!finshed) {
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            _logger.error("InterruptedException: " + e.toString());
        }
    }
}

}

Последний класс, в который я загружаю файлы в S3

public class UploadObject implements Runnable{
static String bucketName = "a205381-auditxml/S3UPLOADER";
private String fileLocation="C:\\Users\\u6034690\\Desktop\\ONEFILE";
//private String fileLocation="D:\\TRFAudits\\";
//static String bucketName = "a205381-auditxml/S3UPLOADER"; 

private static Logger _logger;

List<File> records;
TransferManager tm;

UploadObject(List<File> list,TransferManager tm){
    this.records = list;
    this.tm=tm;
    _logger = Logger.getLogger(UploadObject.class);
}
public void run(){
        System.out.println(Thread.currentThread().getName() + " : ");
        uploadToToS3();
}

public  void uploadToToS3() {

    _logger.info("Number of record to be processed in current thread: : "+records.size());
    MultipleFileUpload xfer = tm.uploadFileList(bucketName, "TEST",new File(fileLocation), records);
    try {
        xfer.waitForCompletion();
        TransferState xfer_state = xfer.getState();
        _logger.info("Upload status -----------------" + xfer_state);

        for (File file : records) {
            try {
                Files.delete(FileSystems.getDefault().getPath(file.getAbsolutePath()));
            } catch (IOException e) {
                System.exit(1);
                _logger.error("IOException: "+e.toString());
            }
        }

        _logger.info("Successfully completed file cleanse");

    } catch (AmazonServiceException e) {
        _logger.error("AmazonServiceException: "+e.toString());
        System.exit(1);
    } catch (AmazonClientException e) {
        _logger.error("AmazonClientException: "+e.toString());
        System.exit(1);
    } catch (InterruptedException e) {
        _logger.error("InterruptedException: "+e.toString());
        System.exit(1);
    }

    System.out.println("Completed");
    _logger.info("Upload completed");
    _logger.info("Calling Transfer manager shutdown");
    //tm.shutdownNow();

}

}

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Звучит так, будто вы отключаете встроенную защиту для S3 (цитируется ниже).Я также перечислил некоторые подобные вопросы ниже;некоторые из них советуют реструктурировать с использованием SQS, чтобы выровнять и распределить нагрузку на S3.

Помимо введения большего количества движущихся частей, вы можете повторно использовать ваши S3Client и TransferManager .Переместите их из вашего работающего объекта и передайте их в его конструктор.TransferManager сам использует многопоточность в соответствии с javadoc.

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

Вы также можете увеличить максимальное количество одновременных подключений , которое использует S3Client.

Может быть:

s3Client.getClientConfiguration().setMaxConnections(75) или даже выше.

DEFAULT_MAX_CONNECTIONS установлено на 50 .

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

Текущий AWS Рекомендации по скорости запросов и производительности

Amazon S3 автоматически масштабируется до высоких уровней запросов.Например, ваше приложение может выполнить не менее 3500 запросов PUT / POST / DELETE и 5500 запросов GET в секунду на префикс в сегменте.Нет ограничений на количество префиксов в корзине.Это просто увеличить вашу производительность чтения или записи в геометрической прогрессии.Например, если вы создаете 10 префиксов в корзине Amazon S3 для распараллеливания операций чтения, вы можете увеличить производительность чтения до 55 000 запросов на чтение в секунду.

Текущее значение AWS S3 Error Best Practices

Tune Application для повторных ошибок SlowDown

Asв любой распределенной системе S3 имеет механизмы защиты, которые обнаруживают преднамеренное или непреднамеренное перерасход ресурсов и реагируют соответствующим образом.Ошибки SlowDown могут возникать, когда высокая частота запросов запускает один из этих механизмов.Снижение частоты запросов уменьшит или устранит ошибки этого типа.Вообще говоря, большинство пользователей не будут регулярно сталкиваться с этими ошибками;однако, если вы хотите получить дополнительную информацию или у вас возникают большие или неожиданные ошибки SlowDown, отправьте сообщение на наш форум разработчиков Amazon S3 https://forums.aws.amazon.com/ или подпишитесь на расширенную поддержку AWS https://aws.amazon.com/premiumsupport/.

Подобные вопросы:

S3 SlowDown: уменьшите исключение по скорости запроса

Лимит запросов S3 для веб-сервисов Amazon

Форумы AWS - максимальное использование соединений для вызовов S3 getObjectMetadata ()

0 голосов
/ 27 ноября 2018

S3 Transfer Acceleration не обязательно дает более высокую скорость загрузки.Это иногда медленнее, чем обычная загрузка при использовании из того же региона.Amazon S3 Transfer Acceleration использует пограничную инфраструктуру AWS, имеющуюся во всем мире, для более быстрой передачи данных в магистраль aws.Когда вы используете Amazon S3 Transfer Acceleration, ваш запрос направляется в лучшее пограничное местоположение AWS с учетом задержки.Затем Transfer Acceleration отправит ваши загрузки обратно на S3 через магистральную сеть, управляемую AWS, используя оптимизированные сетевые протоколы, постоянные соединения от края к источнику, полностью открытые окна отправки и получения и т. Д.Поскольку вы уже находитесь в регионе, вы не увидите никакой выгоды от его использования.Но лучше проверить скорость из https://s3 -accelerate-speedtest.s3-accelerate.amazonaws.com / en / accelerate-speed-сравнениеsion.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...