Kafka将单个日志事件行聚合为组合日志事件

时间:2016-11-08 11:24:41

标签: apache-kafka apache-kafka-streams

我正在使用Kafka来处理日志事件。我对Kafka Connect和Kafka Streams有基本的知识,可用于简单的连接器和流转换。

现在我有一个具有以下结构的日志文件:

timestamp event_id event

日志事件有多个日志行,它们通过event_id连接(例如邮件日志)

示例:

1234 1 START
1235 1 INFO1
1236 1 INFO2
1237 1 END

一般来说,有多个事件:

示例:

1234 1 START
1234 2 START
1235 1 INFO1
1236 1 INFO2
1236 2 INFO3
1237 1 END
1237 2 END

时间窗口(在START和END之间)最长可达5分钟。

结果我想要一个像

这样的话题
event_id combined_log

示例:

1 START,INFO1,INFO2,END
2 START,INFO2,END

实现这一目标的正确工具是什么?我尝试用Kafka Streams解决它,但我可以弄清楚如何...

1 个答案:

答案 0 :(得分:2)

在您的用例中,您实质上是基于消息有效负载重建会话或事务。目前,没有针对此类功能的内置即用型支持。但是,您可以使用Kafka的Streams API的Processor API部分来自行实现此功能。您可以编写使用状态存储的自定义处理器,以跟踪对于给定密钥何时启动,添加和结束会话/事务。

邮件列表中的一些用户一直在使用IIRC,但我不知道我可以指向的现有代码示例。

您需要注意的是正确处理无序数据。在上面的示例中,您按正确的顺序列出了所有输入数据:

1234 1 START
1234 2 START
1235 1 INFO1
1236 1 INFO2
1236 2 INFO3
1237 1 END
1237 2 END

在实践中,消息/记录可能无序到达,如此(我只显示带有键1的消息以简化示例):

1234 1 START
1237 1 END
1236 1 INFO2
1235 1 INFO1

即使发生这种情况,我也了解到,在您的使用案例中,您仍然希望将此数据解释为:START -> INFO1 -> INFO2 -> END而不是START -> END(忽略/删除INFO1和{{1} } =数据丢失​​)或INFO2(错误的顺序,可能也违反了语义限制)。