如果另一个正在运行,则分区主题上的kafka使用者不会启动

时间:2018-03-23 05:11:52

标签: java apache-kafka

我正在尝试使用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())

1 个答案:

答案 0 :(得分:1)

最有可能的是,此问题与group.idGroup ID)有关。如果您对两个消费者使用相同的group.id,那么他们将读取不同的分区集,即不同的消息集。

如果您要使用来自两个消费者的所有消息,则必须为每个不同的消费者定义不同的 group.id

根据官方Kafka documentation

  

消费者使用消费者群组名称和每条记录标记自己   发布到主题的内容将传递给每个主题中的一个消费者实例   订阅消费者群体。消费者实例可以分开   流程或在不同的机器上。

     

如果所有的消费者实例都有相同的消费者群体,那么   记录将有效地在消费者实例上进行负载平衡。

     

如果所有消费者实例都有不同的消费者群体,那么   每条记录都将广播给所有消费者流程。

如果您为每个消费者使用不同的group.id并且仍然无法从双方阅读消息,您可以尝试运行控制台消费者,并确保消费者类没有任何问题。 ;创造了。

kafka-console-consumer --broker-list 192.1xxx:9092,192.... --topic topic_name --from-beginning