【问题标题】:Kafka Consumer is not consuming messages from all partitions卡夫卡消费者没有消费来自所有分区的消息
【发布时间】:2017-05-11 07:20:39
【问题描述】:

我创建了一个包含 10 个分区的 Kafka 主题,并尝试通过单个 kafka 消费者来消费消息。但是,kafka 消费者并未从所有分区中读取消息。更具体地说,它仅使用来自 5 个特定分区的消息。 示例: 消费者仅使用来自 [0,1,2,3,4] 的消息。重新启动后,如果它开始消费来自 [5,6,7,8 ,9] 的消息,那么它将只消费来自这些分区的消息。 这是 kafka-consumer-offset-checker.sh 命令的输出

组|主题| PID |偏移 |日志大小|滞后 |所有者
GRP1 |主题1 | 0 | 128 | 175 | 47 |没有
GRP1 |主题1 | 1 | 117 | 146 | 29 |没有
GRP1 |主题1 | 2 | 62 | 87 | 25 |没有
GRP1 |主题1 | 3 | 101 | 143 | 42 |没有
GRP1 |主题1 | 4 | 104 | 145 | 41 |没有
GRP1 |主题1 | 5 | 118 | 118 | 0 |没有
GRP1 |主题1 | 6 | 111 | 111 | 0 |没有
GRP1 |主题1 | 7 | 161 | 161 | 0 |没有
GRP1 |主题1 | 8 | 144 | 144 | 0 |没有
GRP1 |主题1 | 9 | 171 | 171 | 0 |没有

有人知道为什么会这样吗?

【问题讨论】:

  • 展示你的消费者的例子?您还可以使用kafkacat 验证预期行为。
  • 我也有类似的问题,但我们有 32 个分区,它只从分区 7 读取。

标签: apache-kafka kafka-consumer-api


【解决方案1】:

本周我在使用spark streaming 读取具有 32 个分区的 kafka 主题时遇到了类似的问题。具体来说,我们使用的是 apache org.apache.spark.streaming.kafka010.* 提供的 spark kafka 流类。

我们只能从单个分区消费。问题是因为我们在 jar 中包含了 kafka 版本 0.10.1.0。即使我们的集群在 0.10.1.0 上,恢复到 0.10.0.1 也可以修复它。

【讨论】:

  • 我遇到这个问题是因为有两个消费者实例,它们是由于一些部署问题而创建的。当我修复构建文件时它得到了解决。我正在使用 0.9.x jar。
  • 是的,听起来我们的问题实际上并不相同。很高兴你明白了。
  • @NathanLoyer 我也面临同样的问题,我的 Kafka 代理版本是 0.10.2,我的 Kafka jar 版本是 0.10.2。那么我应该使用较旧的 Kafka jar 版本吗?这会解决问题还是应该尝试其他方法。
  • 如果您使用的是 spark 流式 kafka 类,则需要 jar 与 spark 中使用的版本相同。
  • 我也遇到过这个问题。我终于发现在后台挂着一个陈旧的消费者,它充当了一个单独的消费者,而我的新进程又充当了一个消费者。当我杀死它时,一切都很好。
【解决方案2】:

Kafka Consumer 推荐配置 要为每个消费者设置一个分区,需要以正确的方式设计 Kafka 配置。我建议每个主题的每个单线程使用者应该有相同数量的分区。 这意味着如果您想设置 5 个消费者专门使用单个分区,您必须创建具有 5 个分区的主题。在您的情况下,您可能必须使用 ./bin/kafka-topics.sh --zookeeper localhost:9092 --alter --topic testKafka --partitions 5 命令减少分区数量。

根据您的问题,由于主题被部分消费,消费者可能已被配置为消费者组。同一组中的另一个消费者可能正在使用剩余的分区,并且由于消费者少于分区,因此分区处于非活动状态。

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 2020-07-24
    • 1970-01-01
    • 2020-03-14
    • 2021-01-26
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多