我创建了一个包含10个分区的Kafka主题,并尝试通过单个kafka使用者使用消息。但是,kafka使用者不会从所有分区读取消息。更具体地说,它仅消耗来自5个特定分区的消息。 示例:消费者仅消费来自[0,1,2,3,4]的消息。并且在重新启动后如果它开始消耗来自[5,6,7,8,9]的消息,那么它将仅消耗来自这些分区的消息。 这是kafka-consumer-offset-checker.sh命令的输出
Group|Topic | Pid | Offset | logSize| Lag | Owner GRP1 | topic1 | 0 | 128 | 175 | 47 | none GRP1 | topic1 | 1 | 117 | 146 | 29 | none GRP1 | topic1 | 2 | 62 | 87 | 25 | none GRP1 | topic1 | 3 | 101 | 143 | 42 | none GRP1 | topic1 | 4 | 104 | 145 | 41 | none GRP1 | topic1 | 5 | 118 | 118 | 0 | none GRP1 | topic1 | 6 | 111 | 111 | 0 | none GRP1 | topic1 | 7 | 161 | 161 | 0 | none GRP1 | topic1 | 8 | 144 | 144 | 0 | none GRP1 | topic1 | 9 | 171 | 171 | 0 | none
有谁知道为什么会发生这种情况......?
答案 0 :(得分:0)
本周我在使用spark streaming从具有32个分区的kafka主题中读取时遇到了类似的问题。具体来说,我们使用了apache org.apache.spark.streaming.kafka010.*提供的spark kafka流媒体类。
我们只能从单个分区消费。问题是因为我们在我们的jar中加入了kafka版本0.10.1.0
。即使我们的群集在0.10.0.1
上,也会恢复0.10.1.0
修复它。
答案 1 :(得分:0)
Kafka Consumer推荐的配置
要为每个使用者设置单个分区,需要以正确的方式设计Kafka配置。我建议您每个主题的每个单线程使用方应具有相同数量的分区。
这意味着,如果要设置5个消费者专用的单个分区,则必须创建具有5个分区的主题。在您的情况下,您可能必须使用./bin/kafka-topics.sh --zookeeper localhost:9092 --alter --topic testKafka --partitions 5
命令减少分区数。
根据您的问题,由于主题已被部分消耗,因此可能已将使用者配置为使用者组。同一组中的另一个使用者可能正在消耗剩余的分区,并且由于使用者少于分区,因此该分区处于非活动状态。