Amazon web services 分区运动消防软管S3记录(按事件时间)

Amazon web services 分区运动消防软管S3记录(按事件时间),amazon-web-services,amazon-kinesis,amazon-kinesis-firehose,Amazon Web Services,Amazon Kinesis,Amazon Kinesis Firehose,Firehose->S3使用当前日期作为在S3中创建密钥的前缀。因此,这会在写入记录时对数据进行分区。我的消防软管流包含具有特定事件时间的事件 有没有办法创建包含此事件时间的S3键?下游的处理工具依赖于每个事件都位于与实际发生时间相关的“小时文件夹”中。或者,在消防软管完成后,这必须是一个额外的处理步骤吗 事件时间可以在分区键中,或者我可以使用Lambda函数从记录中解析它。Kinesis Firehose(尚未)允许客户端控制如何生成最终S3对象的日期后缀 您唯一的选择是在Kinesis Fi

Firehose->S3使用当前日期作为在S3中创建密钥的前缀。因此,这会在写入记录时对数据进行分区。我的消防软管流包含具有特定事件时间的事件

有没有办法创建包含此事件时间的S3键?下游的处理工具依赖于每个事件都位于与实际发生时间相关的“小时文件夹”中。或者,在消防软管完成后,这必须是一个额外的处理步骤吗

事件时间可以在分区键中,或者我可以使用Lambda函数从记录中解析它。

Kinesis Firehose(尚未)允许客户端控制如何生成最终S3对象的日期后缀


您唯一的选择是在Kinesis Firehose之后添加后处理层。例如,您可以使用数据管道安排每小时一次的EMR作业,读取上一小时写入的所有文件,并将其发布到正确的S3目的地。

这不是问题的答案,但我想解释一下根据事件到达时间存储记录背后的想法

先说几句关于流的话。运动只是一个数据流。它有一个消费的概念。只有通过顺序读取流才能可靠地使用它。还有一种想法是,检查点是暂停和恢复消费过程的一种机制。检查点只是一个序列号,用于标识流中的位置。通过指定此数字,可以开始从特定事件读取流

现在回到默认的s3消防软管设置…由于kinesis流的容量非常有限,很可能需要将来自kinesis的数据存储在某个地方,以便稍后进行分析。而s3的消防水龙带设置就是这样做的。它只是将原始数据从流存储到s3存储桶。但从逻辑上讲,这些数据仍然是相同的记录流。为了能够可靠地使用(读取)这个流,需要检查点的序列号。这些数字是到达时间的记录


如果我想按创建时间读取记录,该怎么办?完成此任务的正确方法似乎是按顺序读取s3流,将其转储到某个[时间序列]数据库或数据仓库,并根据此存储进行基于创建时间的读取。否则,在读取s3(流)时,总是有非零的机会错过一些事件串。因此,我不建议对s3存储桶进行重新排序。

对于未来的读者,Firehose支持Amazon s3对象的自定义前缀


要做到这一点,您需要进行一些后处理或编写一个自定义流媒体消费者(如Lambda)

我们公司处理了大量的事件,所以编写Lambda函数似乎不是一个很好的用钱方法。相反,我们发现使用Athena进行批处理是一个非常简单的解决方案

首先,将数据流传输到雅典娜表中,
events
,该表可以是可选的

然后,定义另一个雅典娜表,例如,
events\u by\u event\u time
,该表由事件的
event\u time
属性进行分区,或者以模式中定义的方式进行分区

最后,您计划了一个进程来运行雅典娜查询,该查询从
事件中获取事件,并按事件时间自动将它们重新分区到
事件中,现在您的事件按
事件时间进行分区,而无需EMR、数据管道或任何其他基础设施

您可以使用事件中的任何属性执行此操作。还值得注意的是,您可以创建一个视图,该视图执行两个表中的一个,以查询实时和历史事件


实际上,我在一篇文章中写了更多关于这方面的内容。

这并没有回答问题。问题是关于“事件时间”,即事件中的时间字段。Firehose仅支持“处理时间”,请参阅:
Kinesis数据Firehose使用最早记录的近似到达时间戳,该记录包含在正在写入的Amazon S3对象中