在 S3 中使用 lambda 函数解压缩档案真的很慢
Posted
技术标签:
【中文标题】在 S3 中使用 lambda 函数解压缩档案真的很慢【英文标题】:using lambda functions to unzip archives in S3 is really sloooooow 【发布时间】:2015-04-23 21:47:30 【问题描述】:我的公司正在将大型存档文件上传到 S3,现在希望将它们解压缩到 S3 上。我编写了一个基于 unzip 的 lambda 函数,由文件到达 xxx-zip 存储桶触发,该函数从 S3 流式传输 zip 文件,解压缩流,然后将单个文件流式传输到 xxx-data 存储桶。
它可以工作,但我发现它比我预期的要慢得多 - 即使在一个测试文件上,zip 大小约为 500k 并包含大约 500 个文件,这是超时设置为 60 秒的超时。这看起来对吗?在我使用节点运行的本地系统上,它比这更快。在我看来,由于文件在 Amazon 的云中移动,延迟应该很短,并且由于文件正在流式传输,因此实际花费的时间应该大约是解压缩流所需的时间。
这是否不起作用的内在原因,或者我的代码中是否存在导致它如此缓慢的东西?这是我第一次使用 node.js,所以我可能做的很糟糕。或者有没有更好的方法来做到这一点,而我在 google 上找不到?
这里是代码大纲(BufferStream
是我写的一个类,它把s3.getObject()
返回的Buffer包装成readStream
)
var aws = require('aws-sdk');
var s3 = new aws.S3(apiVersion: '2006-03-01');
var unzip = require('unzip');
var stream = require('stream');
var util = require( "util" );
var fs = require('fs');
exports.handler = function(event, context)
var zipfile = event.Records[0].s3.object.key;
s3.getObject(Bucket:SOURCE_BUCKET, Key:zipfile,
function(err, data)
var errors = 0;
var total = 0;
var successful = 0;
var active = 0;
if (err)
console.log('error: ' + err);
else
console.log('Received zip file ' + zipfile);
new BufferStream(data.Body)
.pipe(unzip.Parse()).on('entry', function(entry)
total++;
var filename = entry.path;
var in_process = ' (' + ++active + ' in process)';
console.log('extracting ' + entry.type + ' ' + filename + in_process );
s3.upload(Bucket:DEST_BUCKET, Key: filename, Body: entry, ,
function(err, data)
var remaining = ' (' + --active + ' remaining)';
if (err)
// if for any reason the file is not read discard it
errors++
console.log('Error pushing ' + filename + ' to S3' + remaining + ': ' + err);
entry.autodrain();
else
successful++;
console.log('successfully wrote ' + filename + ' to S3' + remaining);
);
);
console.log('Completed, ' + total + ' files processed, ' + successful + ' written to S3, ' + errors + ' failed');
context.done(null, '');
);
【问题讨论】:
【参考方案1】:我怀疑您使用的解压缩模块是一个 javascript 实现,它允许您解压缩 zip 文件 - 这非常慢。
我建议使用 gzip 压缩文件 并使用 C 编译的内部 zlib 库,应该提供更好的性能。
如果您选择坚持使用 zip,您可以联系亚马逊支持并要求增加 lambda 函数的 60 秒限制。
【讨论】:
感谢您的建议。我正在尝试使用 zlib 来比较时间,但在上传到 S3 时遇到了问题 (***.com/questions/28688490/…) 经过更多测量后,我发现导致问题的是文件的大小,而不是数量。如果存档包含一个 5MB 的文本文件,则仅此一项就花费了大部分时间。所以看起来这不是正确的方法。我将把它写在来自 SQS 的 EC2 轮询上。以上是关于在 S3 中使用 lambda 函数解压缩档案真的很慢的主要内容,如果未能解决你的问题,请参考以下文章
如果通过验证,AWS lambda 读取 zip 文件执行验证并解压缩到 s3 存储桶
使用 boto3 lib 和 AWS Lambda 从 S3 存储桶中的压缩文件中获取数据流
在AWS lambda函数上使用pyspark二进制文件,在向驱动程序发送其端口号之前退出错误Java网关进程
无法将 s3 与来自 aws lambda 的 ec2 文件夹同步