Оптимизация загрузки S3 для большого количества крошечных файлов

В настоящее время я использую TransferManager для загрузки всех файлов в корзине S3 из функции Lambda.

// Initialize
TransferManagerBuilder txBuilder = TransferManagerBuilder.standard();
// txBuilder.setExecutorFactory(() -> Executors.newFixedThreadPool(50));
TransferManager tx = txBuilder.build();
final Path tmpDir = Files.createTempDirectory("/tmp/s3_download/");

// Download
MultipleFileDownload download = tx.downloadDirectory(bucketName,
                                                     bucketKey,
                                                     new File(tmpDir.toUri()));
download.waitForCompletion();

return Files.list(tmpDir.resolve(bucketKey)).collect(Collectors.toList());

Кажется, требуется около 300 seconds, чтобы загрузить 10,000 files (размер ~20KB each), что дает мне скорость передачи около 666 KBps. Увеличение размера пула потоков вообще не влияет на скорость передачи.

Конечная точка S3 и лямбда-функция находятся в одном регионе AWS и в одной учетной записи AWS.

Как я могу оптимизировать загрузки S3?


person John Bupit    schedule 18.04.2018    source источник


Ответы (1)


Работа с большим количеством данных всегда требует проектирования хранилища с учетом базовых систем.

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

Рекомендации по частоте запросов:

https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html.

Ускорение передачи:

https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html

Как увеличить пропускную способность:

https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-performance-improve/

Надеюсь, это поможет.

ИЗМЕНИТЬ1

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

https://docs.aws.amazon.com/lambda/latest/dg/limits.html

person Kannaiyan    schedule 18.04.2018
comment
К моим файлам прикреплен хешированный префикс. Я ищу решения, которые помогут мне достичь решений, близких к 300 запросам в секунду (текущий TransferManager дает мне около 33 файлов в секунду). CloudFront у меня тоже не работает из-за загруженности. - person John Bupit; 18.04.2018
comment
Обновил ответ - person Kannaiyan; 18.04.2018
comment
Спасибо, что указали на ограничения Lambda. Мне известно об эфемерном хранилище, и я пытаюсь обработать файлы, которые находятся в этих пределах (10 000 файлов размером ~ 20 КБ каждый ~ = 200 МБ ‹512 МБ). Мне также известно об ограничении дескриптора файла в 1024 - вы предполагаете, что это узкое место для скорости загрузки в моем конкретном случае? - person John Bupit; 18.04.2018
comment
Это слишком много для хранения Lambda. Вам необходимо использовать внешнее хранилище для масштабируемости. - person Kannaiyan; 18.04.2018