我有一个Firehose流,该流旨在吸收来自不同来源和不同事件类型的数百万个事件。该流应将所有数据作为原始的\未更改的数据存储到一个S3存储桶中。
我当时正在考虑根据事件消息中嵌入的元数据(例如事件源,事件类型和事件日期)在S3中对该数据进行分区。
但是,Firehose根据记录到达时间遵循其默认分区。是否可以根据我的需要自定义此分区行为?
答案 0 :(得分:3)
不。您不能基于事件内容进行“分区”。
一些选项是:
如果要将输出与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 处理过这个问题。