我正在尝试使用kafka实现多个使用者 - 单一生产者设置。我创建了一个包含3个分区的主题,如下所示:
./kafka-create-topic.sh --topic stream.main.out --zookeeper
localhost:2181 --partition 3
生产者的设置如下:
props = new Properties();
props.put("serializer.class", "kafka.serializer.StringEncoder");
props.put("broker.list","xxx.xxx.x:9092,.....");
props.put("request.required.acks", "1");
props.put("topic.metadata.refresh.interval.ms", "1");
props.put("partitioner.class", "kafka.producer.DefaultPartitioner");
//props.put("enable.auto.cimmit","true");
//props.put("auto.commit.interval.ms","10");
现在,如果我启动第一个消费者,它运行良好;启动第二个消费者是问题所在。它启动但似乎在等待消息,没有任何事情发生超过10分钟。为什么会这样? 我尝试在没有多个分区的情况下进行此操作,但是即使使用相同的组ID,每个消费者似乎都会收到相同的消息。
props = new Properties();
props.put("metadata.broker.list", "192.xxxx:9092,....");
props.put("serializer.class", "kafka.serializer.StringEncoder");
props.put("broker.list","192.1xxx:9092,192....");
props.put("request.required.acks", "1");
ConsumerConnector consumer =
kafka.consumer.Consumer.createJavaConsumerConnector(
createConsumerConfig(zooKeeper, groupId));
Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
topicCountMap.put(topic, new Integer(1));
Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);
for ( KafkaStream stream : streams) {
ConsumerIterator<byte[], byte[]> it = stream.iterator();
while (it.hasNext())
答案 0 :(得分:1)
最有可能的是,此问题与group.id
(Group ID)有关。如果您对两个消费者使用相同的group.id
,那么他们将读取不同的分区集,即不同的消息集。
如果您要使用来自两个消费者的所有消息,则必须为每个不同的消费者定义不同的 group.id
。
根据官方Kafka documentation:
消费者使用消费者群组名称和每条记录标记自己 发布到主题的内容将传递给每个主题中的一个消费者实例 订阅消费者群体。消费者实例可以分开 流程或在不同的机器上。
如果所有的消费者实例都有相同的消费者群体,那么 记录将有效地在消费者实例上进行负载平衡。
如果所有消费者实例都有不同的消费者群体,那么 每条记录都将广播给所有消费者流程。
如果您为每个消费者使用不同的group.id
并且仍然无法从双方阅读消息,您可以尝试运行控制台消费者,并确保消费者类没有任何问题。 ;创造了。
kafka-console-consumer --broker-list 192.1xxx:9092,192.... --topic topic_name --from-beginning