每小时或每天都有一个卡夫卡主题是典型的吗?

Posted

技术标签:

【中文标题】每小时或每天都有一个卡夫卡主题是典型的吗?【英文标题】:Is it typical to have a kafka topic per hour or per day? 【发布时间】:2017-07-20 04:09:08 【问题描述】:

我正在将页面访问和搜索查询(某种点击流分析)记录到 kafka。我打算定期对它们进行批处理,比如每小时或每天,然后将汇总结果写入 elasticsearch。

如果不是写入kafka,而是写入文件系统,很容易配置logger写入文件名中带有时间戳的文件,自动按照小时/天间隔分隔日志。

但是使用 kafka,我在 Google 上搜索了足够多的时间,但还没有找到任何每小时/每天创建一个新主题的示例。如果不每小时/每天创建一个新主题,我只能想象通过 logstash/flume 将日志从 kafka 移动到文件系统或 hdfs。

直接在kafka上做批处理(每小时/天)很少见吗?

【问题讨论】:

我不确定我是否理解您为什么需要每小时/每天一个新主题。为什么不将所有日志发送到单个主题并进行批处理?每次处理后,主题分区上的已提交偏移量会向前移动,因此您不会重新处理相同的日志。 如果所有数据都写入同一个主题,因为它们可能以不同的顺序到达,这意味着数据中的CreatedTime可能没有排序。很难确定每天的界限(尽管在我的情况下可能会有轻微的不准确)。如果有写入不同的主题,我可以轻松检查特定主题的最后修改时间是否明显早于当前时间(假设我的批处理在每天上午 00:10 运行)。 您可以通过键对主题进行逻辑分区(在这种情况下,键可以是一天中的小时)。 Kafka 将确保具有相同 key 的所有消息都进入同一个分区,因此被单个消费者线程消费。 @Rahul 这真是个好主意。我可以有任意数量的分区,只要它大于一,然后以分区数取模。谢谢 【参考方案1】:

Kafka由LinkedIn开发,在LinkedIn中的作用是日志聚合中心。所以Kafka非常适合处理这类问题。

我认为每个事件(事件就像页面访问或查询)都应该在您的 Web 服务器中使用时间戳标记,而不是在日志发送到 Kafka 时标记。更具体地说,当页面访问事件发生时,它实际上是向您的 Web 服务器发出请求,然后您的 Web 服务器处理此请求并返回响应。同时,您的 Web 服务器应使用时间戳记录此事件,并且此时间戳是事件的唯一正确时间点。关于如何记录事件?您可以创建一个 log_producer 将特定主题的日志消息发送到您的 Kafka,而不仅仅是将其记录在本地文件中。

关于每小时批量处理日志,你可以创建24个分区并将日志“HOUR”作为分区键,然后如果你做批处理,你只需要拉分区H的日志,如果你想要的小时要处理的是 H 。因为只需要处理最新的 H 小时的日志,旧的 H'log 已经被较旧的进程工作处理并保存了。

【讨论】:

如果我们每小时做一个partition,是不是会限制消费者的数量?因为一次只有 1 个消费者可以从分区中读取数据。

以上是关于每小时或每天都有一个卡夫卡主题是典型的吗?的主要内容,如果未能解决你的问题,请参考以下文章

卡夫卡多个生产者写同一主题?

处理卡夫卡中具有依赖关系的数据时的最佳实践?

卡夫卡流加入

卡夫卡消费者:受控阅读主题

卡夫卡动物园管理员的目的

text 卡夫卡主题一代