Kinesis 到 S3 的自定义分区

4

问题

我阅读了这篇这篇这篇文章。但它们对于问题提供了相互矛盾的答案:如何在从Kinesis流摄取数据到S3时自定义分区?

更多细节

目前,我正在使用Firehose将数据从Kinesis Streams传递到Athena。之后,数据将使用EMR Spark进行处理。

不时地,我必须处理历史批量摄入到Kinesis流中。问题是我的Spark逻辑严重依赖于数据分区和事件处理顺序。但是Firehouse仅支持按照ingestion_time(进入Kinesis流)分区,而不是按照任何其他自定义字段(我需要按照event_time)。

例如,在Firehouse的分区2018/12/05/12/some-file.gz下,我可以获取最近几年的数据。

解决方法

你能帮我选择以下哪个选项吗?

  1. 使用自定义lambda复制/分区来自Kinesis Steam的数据。但对我来说,这看起来更加复杂和容易出错。也许是因为我不太熟悉AWS Lambda。此外,我不确定它在批量加载上的性能如何。在这篇文章中说,Lambda选项比Firehouse传递要贵得多。
  2. 使用Firehouse加载数据,然后启动Spark EMR作业将数据复制到具有正确分区的另一个存储桶中。至少对我来说,这听起来更简单(可能有偏见,我刚开始使用AWS Lambas)。但它有双重复制和额外的Spark作业的缺点。

每小时我最多可能有1M行数据,占用40MB内存(压缩状态下)。从使用AWS Lambda与Amazon Kinesis中,我知道Kinesis到Lambda事件源具有每批次10,000条记录的限制。使用Lambda处理这样的数据量是否有效?

2个回答

1
虽然 Kinesis 不允许您定义自定义分区,但 Athena 允许!Kinesis 流将流入一个表,比如说 data_by_ingestion_time,您可以定义另一个具有相同模式但由 event_time 分区的表 data_by_event_time。现在,您可以利用 Athena 的 INSERT INTO 能力来让您重新分区数据,而不需要编写 Hadoop 或 Spark 作业,并且您可以获得 Athena 的无服务器规模扩展以处理数据量。您可以使用 SNS、cron 或类似 Airflow 的工作流引擎,在需要的任何时间间隔内运行此操作。我们在我的公司处理了这个问题,并深入探讨了使用 EMR 或流解决方案的权衡细节,但现在您不需要再引入像 Lambda 或 EMR 这样的系统了。

https://radar.io/blog/custom-partitions-with-kinesis-and-athena


0

我知道这是可能的。答案应该包含为什么一个选项比另一个更好/更差的考虑因素。我不明白所引用的资源(“Kinesis入门”)如何回答我的问题。 - VB_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接