Чтение файла на AWS S3 с лямбда Java - PullRequest
0 голосов
/ 14 декабря 2018

КОНТЕКСТ:

Я пытаюсь прочитать файл csv на AWS s3, вычислить его данные и записать результаты на другом csv в том же контейнере s3.

Я попробовал следующий код, чтобы создать класс, который будет читать мои Main, с аргументами, хранящимися в текстовом файле с именем lambdaCmd.txt.Каждый раз, когда lambdaCmd.txt изменяется, запускается лямбда-функция, и содержимое lambdaCmd.txt передается следующему классу через параметр s3event:

public class LambdaCmd implements RequestHandler<S3Event, Void>{

    static final Logger LOGGER = LogManager.getLogger(LambdaCmd.class);

    @Override
    public Void handleRequest(S3Event s3event, Context context) {

        //Getting my txt file's path
        S3EventNotification.S3EventNotificationRecord record = s3event.getRecords().get(0);
        String bkt = record.getS3().getBucket().getName();
        String key = record.getS3().getObject().getKey().replace('+', ' ');
        try {
            key = URLDecoder.decode(key, "UTF-8");
        } catch (UnsupportedEncodingException ex) {
            LOGGER.error(ex);
        }

        AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

        try {

            //Getting my text file as a String Stream
            InputStreamReader cmdStream =
                new InputStreamReader(s3Client.getObject(bkt, key).getObjectContent());
            BufferedReader br = new BufferedReader(cmdStream);

            //Parsing the command in cmdStream
            //...
            //The command is now "String[] cmdArray" to be passed to my main

            MyMain.main(cmdArray);
            //The main function reads and write from s3 with a similar use of s3Client

            br.close();

        } catch (IOException | IllegalArgumentException | NullPointerException ex) {
            LOGGER.error(ex);
        }

        return null;
    }
}

ПРОБЛЕМА:

После регистрации некоторых отладочных сообщений в этом коде я выяснил, что лямбда-функция останавливается на этой строке:

        AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

Вот журнал CloudWatch (я скрываю личную информацию с помощью ##########):

START RequestId: ########## Version: $LATEST
16:12:11.596 [main] DEBUG path.to.mylambdaclass.LambdaCmd - LambdaCmd started
16:12:11.616 [main] DEBUG path.to.mylambdaclass.LambdaCmd - Just before creating s3Client
END RequestId: ##########
REPORT RequestId: ##########    Duration: 12398.45 ms   Billed Duration: 12400 ms Memory Size: 128 MB   Max Memory Used: 67 MB

У меня также есть сообщение журнала сразу после создания s3Client, но оно не печатается в журналах.

ВОПРОС:

Почему моя лямбда преждевременно заканчивается?Я неправильно использую некоторые объекты?

1 Ответ

0 голосов
/ 17 декабря 2018

После добавления следующей попытки / перехвата упаковки весь код в методе handleRequest (я не ловил ошибки, поэтому я его не видел):

try {
    //My code above
} catch (Error | Exception e) {
    LOGGER.error(e);
}

Я получил java.lang.OutOfMemoryError.Я установил лямбда-память на 128 МБ, так как мой локальный код работал с меньшим количеством.Но похоже, что чтение с s3 требует немного больше, и теперь оно отлично работает с 512 МБ.

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