问题
我阅读了这篇,这篇和这篇文章。但它们对于问题提供了相互矛盾的答案:如何在从Kinesis流摄取数据到S3时自定义分区?
更多细节
目前,我正在使用Firehose将数据从Kinesis Streams传递到Athena。之后,数据将使用EMR Spark进行处理。
不时地,我必须处理历史批量摄入到Kinesis流中。问题是我的Spark逻辑严重依赖于数据分区和事件处理顺序。但是Firehouse仅支持按照ingestion_time
(进入Kinesis流)分区,而不是按照任何其他自定义字段(我需要按照event_time
)。
例如,在Firehouse的分区2018/12/05/12/some-file.gz
下,我可以获取最近几年的数据。
解决方法
你能帮我选择以下哪个选项吗?
- 使用自定义lambda复制/分区来自Kinesis Steam的数据。但对我来说,这看起来更加复杂和容易出错。也许是因为我不太熟悉AWS Lambda。此外,我不确定它在批量加载上的性能如何。在这篇文章中说,Lambda选项比Firehouse传递要贵得多。
- 使用Firehouse加载数据,然后启动Spark EMR作业将数据复制到具有正确分区的另一个存储桶中。至少对我来说,这听起来更简单(可能有偏见,我刚开始使用AWS Lambas)。但它有双重复制和额外的Spark作业的缺点。
每小时我最多可能有1M行数据,占用40MB内存(压缩状态下)。从使用AWS Lambda与Amazon Kinesis中,我知道Kinesis到Lambda事件源具有每批次10,000条记录的限制。使用Lambda处理这样的数据量是否有效?