如何解决Kafka Consumer轮询超时错误

时间:2019-06-10 22:25:22

标签: scala apache-kafka vagrant kafka-consumer-api

我试图通过一个无业游民的机器使用Apache Kafka运行一个简单的Kafka Consumer程序。尝试调用.poll(100)方法时,该程序被卡在for循环之前。

很多事情都在深入研究调试类,但没有发现很多。

val TOPIC="testTopic"

val  props = new Properties()
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.56.10:9092")
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest")
props.put(ConsumerConfig.GROUP_ID_CONFIG, UUID.randomUUID().toString());

props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")

val consumer = new KafkaConsumer[String, String](props)

consumer.subscribe(util.Collections.singletonList(TOPIC))

while(true) {
  println("Test")
  val records = consumer.poll(100)
  for (record <- records.asScala) {
    println(record)
  }
  println("Test2")
}

}

当前输出Test,然后卡住,没有错误消息。预计它将输出Kafka主题的内容。

1 个答案:

答案 0 :(得分:0)

您需要升级您的 kafka客户端版本至2.0.0或更高版本。例如,当kafka服务器关闭时,使用KafkaConsumer类中的poll方法,您将卡在内部循环中,等待代理再次可用。

根据KIP-266

  

ConsumerRecords

     

投票(长时间超时)

     

已弃用。从2.0开始。 使用民意测验(持续时间),该测验不会阻止   超过超时等待分区分配。有关更多信息,请参见KIP-266   信息。

在您的情况下:

import org.apache.kafka.clients.consumer.KafkaConsumer; 
import scala.concurrent.duration._

// ...
val timeout = Duration(100, MILLISECONDS) 

while(true) {
  println("Test")
  val records = consumer.poll(timeout)
  for (record <- records.asScala) {
    println(record)
  }
  println("Test2")
}

//...

最后,您只需要导入KafkaConsumer类的新版本,并将timeout参数作为Duration对象的实例传递给新的poll方法。