Firehose-> S3使用当前日期作为在S3中创建密钥的前缀。因此,这会在写入记录时对数据进行分区。我的firehose流包含具有特定事件时间的事件。
有没有办法创建包含此事件时间的S3键?下游的处理工具取决于每个事件位于"小时文件夹"与它何时发生有关。或者,在Firehose完成后,这是否必须是一个额外的处理步骤?
事件时间可以在分区键中,或者我可以使用Lambda函数从记录中解析它。
答案 0 :(得分:6)
Kinesis Firehose(尚未)允许客户端控制如何生成最终S3对象的日期后缀。
唯一的选择是在Kinesis Firehose之后添加后处理层。例如,您可以使用数据管道安排每小时的EMR作业,该作业读取在过去一小时内写入的所有文件并将其发布到正确的S3目的地。
答案 1 :(得分:1)
这不是问题的答案,但我想解释一下根据事件到达时间存储记录的想法。
首先谈谈流媒体。 Kinesis只是一个数据流。它有消费的概念。只有通过顺序读取流才能可靠地消耗流。并且还存在检查点作为暂停和恢复消费过程的机制的想法。检查点只是一个序列号,用于标识流中的位置。通过指定此数字,可以开始从特定事件中读取流。
现在回到默认的s3 firehose设置... 由于kinesis流的容量非常有限,很可能需要在某处存储来自kinesis的数据以便稍后进行分析。而 firehose to s3 setup 开箱即用。它只是将流中的原始数据存储到s3存储桶中。但从逻辑上讲,这些数据仍然是记录流。并且为了能够可靠地消耗(读取)该流,需要这些序列号用于检查点。这些数字是记录到达时间。
如果我想按创建时间读取记录怎么办?看起来完成此任务的正确方法是按顺序读取s3流,将其转储到某些[时间序列]数据库或数据仓库并针对此存储执行基于创建时间的读数。否则,在读取s3(流)时,总会有非零机会错过一些事件。所以我不建议重新订购s3桶。
答案 2 :(得分:1)
您需要进行一些后处理或编写自定义流消费者(例如 Lambda)来执行此操作。
我们公司处理了大量事件,因此编写 Lambda 函数似乎不太划算。相反,我们发现使用 Athena 进行批处理是一个非常简单的解决方案。
首先,您流式传输到 Athena 表 events
,它可以是 partitioned by an arrival-time。
然后,您定义另一个 Athena 表,例如 events_by_event_time
,它由事件的 event_time
属性分区,或者它已在架构中定义。
最后,您安排了一个进程来运行 Athena INSERT INTO 查询,该查询从 events
获取事件并自动将它们重新分区到 events_by_event_time
,现在您的事件按 event_time
进行分区无需 EMR、数据管道或任何其他基础设施。
您可以使用事件的任何属性执行此操作。还值得注意的是,您可以创建一个视图,对两个表进行 UNION 查询以查询实时和历史事件。
实际上我在 blog post here 中写了更多关于此的内容。
答案 3 :(得分:0)
对于将来的读者-Firehose支持Amazon S3对象的自定义前缀
https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html