Kafka Consumer的poll()方法被阻止

时间:2016-06-07 14:36:36

标签: apache-kafka polling kafka-consumer-api kafka-producer-api

我是Kafka 0.9的新手并测试了一些功能我在Java实现的Consumer(KafkaConsumer)中发现了一种奇怪的行为。

Kafka经纪人位于 Ambari 外部机器中。

即使你可以实现Producer并开始向外部代理发送消息,我也不知道为什么当消费者试图读取事件(poll)时,它会被卡住。

我知道制作人工作得很好,因为我可以通过控制台消费者(在ambari本地工作)消费消息。但是当我执行Java Consumer时,什么都没发生,只是卡住了。调试代码我可以看到它在poll()行被阻止:

    ConsumerRecords<String, String> records = consumer.poll(100);

顺便说一句,超时什么都不做。如果你输入0,100或1000毫秒无关紧要,消费者在这一行被阻止并且不会超时也不会抛出异常。

我尝试了所有类型的替代属性,例如 advertised.host.name advertised.listener ,...等等,运气不佳。

任何帮助都将受到高度赞赏。提前谢谢!

2 个答案:

答案 0 :(得分:6)

原因可能是运行消费者代码的计算机无法连接到zookeeper。尝试在安装了Kafka的机器上运行相同的消费者代码(我试过这个并为我工作)。我还通过在server.properties文件中提到以下属性来解决问题: advertised.host.name="ip address which you want to expose" //在我的情况下,它是ec2机器的公共IP,我在相同的ec2上安装了kafka和zookeeper。 advertised.port=9092 ConsumerRecords<String, String> records = consumer.poll(100); 以上陈述并不意味着消费者将在100毫秒后超时,这是投票期。无论它在100毫秒内捕获的数据都被读入记录集。

答案 1 :(得分:1)

在我的情况下,poll()方法最终陷入了无限循环sureCoordinatorReady(),协调器一词提到我协调器在另一台主机上运行。(出于测试目的,我仅将一个代理主机添加到我的/ etc中/ hosts,而总共有3个代理)。这样消费者才能正确地找到消费者协调员。

所以解决方案出来了: 在/ etc / hosts文件

中配置正确运行kafka代理的主机