V. *_*mma 4 concatenation amazon-s3 aws-sdk aws-lambda amazon-kinesis-firehose
有没有办法使用Lambda进行S3文件串联?
我有Firehose以最长的间隔(15分钟或128mb)将数据流式传输到S3,因此我每天有96个数据文件,但是我想将所有数据聚合到一个日常数据文件中,以便在以后读取数据时获得最快的性能。在Spark(EMR)中。
我创建了一个解决方案,当Firehose将新文件流式传输到S3时,将调用Lambda函数。然后,该函数从源存储桶中读取(s3.GetObject)新文件,并从目标存储桶中读取已连接的每日数据文件(如果以前的每日数据已经存在,则创建一个新文件),将两个响应体都解码为字符串,然后只需将它们加在一起,然后使用s3.PutObject(覆盖先前的聚合文件)写入目标存储桶即可。
问题在于,当聚合文件达到150+ MB时,Lambda函数在读取两个文件时会达到其〜1500mb的内存限制,然后失败。
目前,我的数据量很少,每天只有几百MB-s,但是将来这个数字将成倍增长。对我来说,Lambda的限制如此之低,以至于文件太小它们已经达到了。
或者,最好是由S3对象创建的事件或某种方式调度的作业(例如每天调度的)调用串联S3数据的替代方法?
我会重新考虑您是否真的要这样做:
相反,除非在这种情况下是不可能的,否则,如果将Firehose文件设置得尽可能小,然后立即将它们发送到Spark :
我不特别了解Spark,但总的来说,这样的“管道式”解决方案涉及:
当然,如果不可能以合理的金额准备好Spark数据(但不可查询(“可查询”?我不知道)),那么这可能不是一个选择。注入小块数据也可能非常耗时,但这对于可用于生产环境的系统似乎不太可能。
如果确实需要将数据分块到每日转储中,则可以使用分段上传。相比之下,我们每分钟从Firehose进行少量文件处理(每天很多GB),而没有明显的开销。
小智 5
您可以创建一个 Lambda 函数,该函数每天仅使用计划事件调用一次,并且在您的 Lambda 函数中,您应该使用上传部分 - 复制,无需在 Lambda 函数上下载文件。这个线程中已经有一个这样的例子
归档时间: |
|
查看次数: |
5776 次 |
最近记录: |