繁体   English   中英

使用Java Lambda在AWS S3上读取文件

[英]Reading a file on aws s3 with a Java lambda

语境:

我正在尝试在AWS s3上读取一个csv文件,计算其数据,并将结果写入同一s3存储桶中的另一个csv中。

我尝试使用以下代码创建一个类,该类将读取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;
    }
}

问题:

在此代码中记录了一些调试消息后,我发现lambda函数在此行停止:

        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 ,我也有一条日志消息,但是它没有打印在日志中。

题 :

为什么我的lambda过早结束? 我会滥用一些物品吗?

添加以下try / catch并将所有代码包装在handleRequest方法中之后(我没有捕获错误,这就是为什么我没有看到它的原因):

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

我有一个java.lang.OutOfMemoryError 我将lambda内存设置为128MB,因为我在本地的代码使用的内存不足。 但是看来从s3读取数据还需要更多,现在512MB可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM