Получите размер объектов на S3 с помощью одного вызова API - PullRequest
0 голосов
/ 22 октября 2019

У меня есть Java-приложение, которое извлекает сжатие нескольких объектов на S3 посредством потоковой передачи. Таким образом, чтобы сделать его более эффективным, приложение не загружает объекты на локальный диск и не загружает их снова, а передает потоки файлов по 5 МБ и сжимает их на лету. Задача, с которой я сталкиваюсь, заключается в том, чтобы обеспечить прогресс в этой операции, мне нужно полагаться на общий размер всех объектов и использовать счетчик, чтобы увидеть, сколько из общего размера обрабатывается в качестве источника для вычисления прогресса.

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

Следующий фрагмент кодаВот как я могу получить размер объекта один за другим:

public Long getObjectSize(AmazonS3Client amazonS3Client, String bucket, String key)
        throws IOException {
    return amazonS3Client.getObjectMetadata(bucket, key).getContentLength();
}

ПРИМЕЧАНИЕ. Если бы я полагался на количество объектов для расчета прогресса, это было бы не совсем точно. Некоторые объекты имеют размер 2-3 КБ, а некоторые довольно большие (1-2 ГБ).

1 Ответ

1 голос
/ 22 октября 2019

Вы можете использовать Stream API java 8, чтобы повернуть итерацию и сделать сумму значений, или, возможно, с помощью AmazonCloudWatch API, чтобы помочь вам получить метрику BucketSizeBytes. Так что вам нужно перечислить Metrics и использовать BucketSizeBytes для GetMetricData.

Вот ссылка на документацию: https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudwatch/AmazonCloudWatch.html#listMetrics-com.amazonaws.services.cloudwatch.model.ListMetricsRequest- https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html

Вот несколько примеров AmazonCloudWatch: https://www.javatips.net/api/com.amazonaws.services.cloudwatch.model.metrichttps://www.programcreek.com/java-api-examples/?api=com.amazonaws.services.cloudwatch.AmazonCloudWatchClient

ОБНОВЛЕНИЕ:

Как я уже говорил в одном из этих комментариев, вы также можете использовать интерфейс командной строки. В этом случае вы также используете cloudwatch, но через aws cli и получаете формат ответа JSON. В одной из ссылок, которые я поместил, есть пример, следующий здесь:

aws cloudwatch get-metric-statistics --metric-name BucketSizeBytes
--namespace AWS/S3 --start-time 2016-10-19T00:00:00Z --end-time 2016-10-20T00:00:00Z --statistics Average --unit Bytes --region us-west-2 --dimensions Name=BucketName,Value=ExampleBucket Name=StorageType,Value=StandardStorage --period 86400 --output json

Эта другая ссылка имеет больше объяснений: http://cloudsqale.com/2018/10/08/s3-monitoring-step-1-bucket-size-and-number-of-objects/

В итоге, кажется, что использование cloudwatch являетсяСамый простой способ избежать многих вызовов с итерациями.

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