【问题标题】:Failed to update metadata after 48 ms48 毫秒后无法更新元数据
【发布时间】:2016-11-16 09:45:21
【问题描述】:
val props = new Properties()
props.put("bootstrap.servers", "foo:9092,bar:9092")
props.put("acks", "all")
props.put("retries", 1)
props.put("batch.size", 10000)
props.put("linger.ms", 5)
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")

try {
   producer.send(new ProducerRecord[String, String](topic, key, msg.toJson)).get()
   true
} catch {
   case ex: Throwable => {
      println(ex)
      false
   }
}

这段代码抛出异常

java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 48 ms.\n\tat 
org.apache.kafka.clients.producer.KafkaProducer$FutureFailure.<init>(KafkaProducer.java:686)\n\tat 
org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:449)\n\tat 
org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:339)\

请注意,我正在针对生产集群发布数据,因此它已启动并运行,并且许多应用程序已经成功地将消息发布到该主题。只是我的代码无法发布。

【问题讨论】:

  • 我注意到 max.block.ms 设置为 48 ms,这是一个极低的值。为什么要设置这样的值来检索元数据?
  • @amethystic 这不在给定的配置中,你从哪里得到的?
  • 来自“48ms 后更新元数据失败”。
  • 客户端无法从broker获取元数据,所以请确保连接到foo:9092和bar:9092

标签: scala apache-kafka


【解决方案1】:

看起来主机名或端口有问题,因为您无法使用 TimeoutException 连接您的生产者。您是否尝试过使用相同的生产者配置运行 kafka-console-producer.sh?它真的在那台机器上工作吗?也许,与代理的连接受到 SSL 或 SASL 的保护。不要忘记在 config/tools-log4j.properties 中打开 TRACE 日志记录,这将帮助您调试问题。

【讨论】:

    【解决方案2】:

    我之前遇到了同样的超时异常,当我尝试使用控制台生产者发送消息时,我得到了WARN Error while fetching metadata with correlation id 656 : {metadata-1=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient) 回复。

    对于我自己来说,停止并重新启动代理可以让一切恢复正常。

    【讨论】:

      猜你喜欢
      • 2019-03-18
      • 2020-09-23
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多