每小时或每天都有一个卡夫卡主题是典型的吗?
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 个消费者可以从分区中读取数据。以上是关于每小时或每天都有一个卡夫卡主题是典型的吗?的主要内容,如果未能解决你的问题,请参考以下文章