在交付给S3之前,可以在Kinesis Firehose中自定义分区吗?

时间:2018-07-12 20:27:55

标签: amazon-s3 amazon-kinesis-firehose

我有一个Firehose流,该流旨在吸收来自不同来源和不同事件类型的数百万个事件。该流应将所有数据作为原始的\未更改的数据存储到一个S3存储桶中。

我当时正在考虑根据事件消息中嵌入的元数据(例如事件源,事件类型和事件日期)在S3中对该数据进行分区。

但是,Firehose根据记录到达时间遵循其默认分区。是否可以根据我的需要自定义此分区行为?

2 个答案:

答案 0 :(得分:3)

不。您不能基于事件内容进行“分区”。

一些选项是:

  • 发送到单独的Firehose流
  • 发送到Kinesis数据流(代替Firehose)并编写您自己的自定义Lambda函数来处理和保存数据(请参阅:AWS Developer Forums: Athena and Kinesis Firehose
  • 使用Kinesis Analytics处理消息并将其“定向”到不同的Firehose流中

如果要将输出与Amazon Athena或Amazon EMR一起使用,则还可以考虑将其转换为Parquet格式,其格式为much better performance。这将需要对S3中的数据进行批处理,而不是在数据到达流中时对其进行转换。

答案 1 :(得分:1)

根据 John 的回答,如果您没有近乎实时的流媒体需求,我们发现使用 Athena 进行批处理对我们来说是一个简单的解决方案。

Kinesis 流到可以使用 native record arrival time partitioning 的给定表 unpartitioned_event_data

我们定义了另一个 Athena 表 partitioned_event_table,它可以使用自定义分区键进行定义并利用 Athena 拥有的 INSERT INTO 功能。 Athena 将自动以您想要的格式重新分区您的数据,而无需任何自定义使用者或新基础架构进行管理。这可以通过 cron、SNS 或 Airflow 之类的工具进行安排。

很酷的是,您可以创建一个视图,对两个表执行 UNION 次查询,以便在一个地方查询历史和实时数据。

我们实际上在 Radar 和 talk about more trade-offs in this blog post 处理过这个问题。