ERROR向主题发送消息时出错

时间:2016-07-19 11:49:03

标签: apache-kafka

在kafka中生成消息时,我收到以下错误:

$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic nil_PF1_P1
hi
hello

[2016-07-19 17:06:34,542] ERROR Error when sending message to topic nil_PF1_P1 with key: null, value: 2 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.
[2016-07-19 17:07:34,544] ERROR Error when sending message to topic nil_PF1_P1 with key: null, value: 5 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.


$ bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic nil_PF1_P1
Topic:nil_PF1_P1    PartitionCount:1    ReplicationFactor:1 Configs:
Topic: nil_PF1_P1   Partition: 0    Leader: 2   Replicas: 2 Isr: 2

对此有何看法?

13 个答案:

答案 0 :(得分:12)

而不是更改server.properties包括代码本身中的0.0.0.0。这解决了我的问题。

而不是

CIImage

使用:

// Must use self.scale, to disambiguate from the scale parameter
let floatScale = CGFloat(self.scale)
let pixelSize = CGSize(width: size.width * floatScale, height: size.height * floatScale)
let cropRect = CGRect(origin: CGPoint.zero, size: pixelSize)
guard let output = filter.outputImage?.cropping(to: cropRect) else { return nil }

答案 1 :(得分:11)

可能是因为来自kafka server.properties文件的一些参数。  以下解决方案为我工作。您可以找到更多信息here
1)停止kakfka服务器。

  

$ cd $ KAFKA_HOME / bin
  $ ./kafka-server-stop.sh

2)改变了

  

listeners = PLAINTEXT:// hostname:9092

  

listeners = PLAINTEXT://0.0.0.0:9092

来自

  

$ KAFKA_HOME / config / server.properties`

文件。
3)重启kafka服务器。

  

$ KAFKA_HOME / bin / kafka-server-start.sh /kafka/config/server.properties

答案 2 :(得分:8)

我知道这已经过时了,但这可能适用于正在处理它的其他人: 我改变了两件事:
 1.将“bootstrap.servers”属性或 - broker-list 选项更改为 0.0.0.0:9092
 2.更改(在我的情况下取消注释和编辑)2个属性中的server.properties

  • listeners = PLAINTEXT://your.host.name:9092 to listeners = PLAINTEXT://:909 2
  • advertised.listeners = PLAINTEXT://your.host.name:9092 to advertised.listeners = PLAINTEXT:// localhost:9092

答案 3 :(得分:8)

如果您正在运行 hortonworks 群集,请检查ambari中的侦听端口。

在我的情况下 9092不是我的端口。我去了ambari,发现监听端口设置为6667 它对我有用。的:)

答案 4 :(得分:3)

我今天在confluent_kafka 0.9.2 (0x90200)librdkafka 0.9.2 (0x90401)时遇到了同样的错误。就我而言,我在tutorialpoints示例中指定了错误的代理端口:

$ kafka-console-producer.sh --broker-list localhost:9092 --topic tutorialpoint-basic-ops-01

虽然我的经纪人是在端口 9094

上启动的
$ cat server-02.properties 
broker.id=2
port=9094
log.dirs=/tmp/kafka-example-logs-02
zookeeper.connect=localhost:2181

虽然 9092 端口未打开(netstat -tunap),但kafka-console-producer.sh花了60秒才引发错误。看起来这个工具需要修复:

  • 更快失败
  • 带有更明确的错误消息。

答案 5 :(得分:3)

我遇到了类似的问题,我可以在localhost上制作和使用,但不能在网络上的不同机器上制作和使用。基于几个答案我得到了线索,基本上我们需要向生产者和消费者公开advertised.listener,但是给0.0.0.0也没有用。所以给出了advertised.listeners

的确切IP

advertised.listeners=PLAINTEXT://HOST.IP:9092

我原样离开了listener=PLAINTEXT://:9092

因此,火花将广告的ip和端口暴露给生产者和消费者

答案 6 :(得分:2)

有这个问题: 使用Hortonworks HDP 2.5。 启用Kerberisation

通过提供正确的安全协议和端口来解决。 示例命令:

./kafka-console-producer.sh --broker-list sand01.intranet:6667, san02.intranet:6667, san03.intranet:6667--topic test--security-protocol PLAINTEXTSASL


./kafka-console-consumer.sh --zookeeper sand01:2181 --topic test--from-beginning --security-protocol PLAINTEXTSASL

答案 7 :(得分:2)

就我而言,我正在使用带有Openshift的Kafka docker。我遇到了同样的问题。当我传递值为KAFKA_LISTENERS的环境变量PLAINTEXT://:9092时,它得到了修复。这最终将在 server.properties 下添加创建条目listeners=PLAINTEXT://:9092

听众不必拥有主机名。

答案 8 :(得分:2)

我遇到了上面的异常堆栈跟踪。我调查并找到了根本原因。当我建立具有两个节点的Kafka集群时,我遇到了它。在server.properties中进行了以下设置。这里我将kafka节点1和2的server.properties表示为broker1.properties和broker2.properties

broker1.properties设置

    listeners=PLAINTEXT://A.B.C.D:9092
    zookeeper.connect=A.B.C.D:2181,E.F.G.H:2181

broker2.properties设置

    listeners=PLAINTEXT://E.F.G.H:9092
    zookeeper.connect=A.B.C.D:2181,E.F.G.H:2181

我试图使用以下命令从node1或node2启动生产者: ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic OUR_TOPIC 虽然Kafka在两台机器上运行,但我得到了上述超时异常堆栈跟踪。

虽然制作人是从Leader节点或者跟随者开始的,但我总是这样做。

当使用来自任何经纪人的以下命令时,我能够获得制作者的消息。

   ./bin/kafka-console-producer.sh --broker-list A.B.C.D:9092 --topic OUR_TOPIC
    or
   ./bin/kafka-console-producer.sh --broker-list E.F.G.H:9092 --topic OUR_TOPIC
   or
   ./bin/kafka-console-producer.sh --broker-list A.B.C.D:9092,E.F.G.H:9092 --topic OUR_TOPIC

因此,根本原因是Kafka代理在内部使用侦听器= PLAINTEXT:// EFGH:9092属性同时启动生产者。此属性必须匹配才能在启动生产者时从任何节点启动kafka代理。转换此属性to listeners = PLAINTEXT:// localhost:9092将适用于我们的第一个命令。

答案 9 :(得分:2)

另一种情况。直到我找到带有以下消息的kafka日志时才知道发生了什么:

Caused by: java.lang.IllegalArgumentException: Invalid version for API key 3: 2

显然,生产者使用的是比kafka服务器更新的kafka-client(java),并且使用的API无效(客户端使用1.1和10.0上的服务器)。在客户/制片人上我得到了:

Error producing to topic Failed to update metadata after 60000 ms.

答案 10 :(得分:2)

对于Apache Kafka v2.11-1.1.0

启动Zookeeper服务器:

$ bin/zookeeper-server-start.sh config/zookeeper.properties

启动kafka服务器:

$ bin/kafka-server-start.sh config/server.properties

创建一个主题名称“ my_topic”:

$ bin/kafka-topics.sh --create --topic my_topic --zookeeper localhost:2181 --replication-factor 1 --partitions 1

启动制作人:

$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my_topic

启动消费者:

$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic my_topic --from-beginning

答案 11 :(得分:1)

在主题之后添加这样的一行有助于解决同一问题: ... --topic XXX -属性“ parse.key = true” –属性“ key.separator =:”

希望这对某人有帮助。

答案 12 :(得分:0)

我在Hortonworks(HDP 2.X发行版)安装上使用Apache Kafka。遇到错误消息意味着Kafka生产者无法将数据推送到段日志文件。在命令行控制台中,这意味着两件事:

  1. 您为代理使用的端口不正确
  2. 您在server.properties中的侦听器配置不起作用

如果通过scala api编写时遇到错误消息,请另外使用telnet <cluster-host> <broker-port>检查与kafka群集的连接

注意::如果您使用scala api创建主题,则代理需要一些时间来了解新创建的主题。因此,创建主题后,制作人可能会立即失败并显示错误Failed to update metadata after 60000 ms.

为了解决此问题,我进行了以下检查:

我通过Ambari检查后的第一个区别是,Kafka经纪人在HDP 2.x上的端口6667上监听(Apache Kafka使用9092)。

listeners=PLAINTEXT://localhost:6667

接下来,使用ip代替localhost。 我执行了netstat -na | grep 6667

tcp        0      0 192.30.1.5:6667        0.0.0.0:*               LISTEN     
tcp        1      0 192.30.1.5:52242       192.30.1.5:6667        CLOSE_WAIT 
tcp        0      0 192.30.1.5:54454       192.30.1.5:6667        TIME_WAIT

因此,我将生产者调用修改为用户IP,而不是localhost:

./kafka-console-producer.sh --broker-list 192.30.1.5:6667 --topic rdl_test_2

要监视是否有新记录要写入,请监视/kafka-logs文件夹。

cd /kafka-logs/<topic name>/
ls -lart
-rw-r--r--.  1 kafka hadoop        0 Feb 10 07:24 00000000000000000000.log
-rw-r--r--.  1 kafka hadoop 10485756 Feb 10 07:24 00000000000000000000.timeindex
-rw-r--r--.  1 kafka hadoop 10485760 Feb 10 07:24 00000000000000000000.index

一旦生产者成功写入,段日志文件00000000000000000000.log的大小就会增加。

请参见以下尺寸:

-rw-r--r--. 1 kafka hadoop 10485760 Feb 10 07:24 00000000000000000000.index
-rw-r--r--. 1 kafka hadoop       **45** Feb 10 09:16 00000000000000000000.log
-rw-r--r--. 1 kafka hadoop 10485756 Feb 10 07:24 00000000000000000000.timeindex

此时,您可以运行consumer-console.sh:

./kafka-console-consumer.sh --bootstrap-server 192.30.1.5:6667 --topic rdl_test_2 --from-beginning
response is hello world

在此步骤之后,如果您想通过Scala API生成消息,则更改listeners值(从localhost到公共IP)并通过Ambari重新启动Kafka代理:

listeners=PLAINTEXT://192.30.1.5:6667 

样本制作者如下:

package com.scalakafka.sample
import java.util.Properties
import java.util.concurrent.TimeUnit

import org.apache.kafka.clients.producer.{ProducerRecord, KafkaProducer}
import org.apache.kafka.common.serialization.{StringSerializer, StringDeserializer}

class SampleKafkaProducer {
  case class KafkaProducerConfigs(brokerList: String = "192.30.1.5:6667") {
    val properties = new Properties()
    val batchsize :java.lang.Integer = 1

    properties.put("bootstrap.servers", brokerList)
    properties.put("key.serializer", classOf[StringSerializer])
    properties.put("value.serializer", classOf[StringSerializer])
    //    properties.put("serializer.class", classOf[StringDeserializer])
        properties.put("batch.size", batchsize)
    //    properties.put("linger.ms", 1)
    //    properties.put("buffer.memory", 33554432)
  }

  val producer = new KafkaProducer[String, String](KafkaProducerConfigs().properties)

  def produce(topic: String, messages: Iterable[String]): Unit = {
    messages.foreach { m =>
      println(s"Sending $topic and message is $m")
      val result = producer.send(new ProducerRecord(topic, m)).get()
      println(s"the write status is ${result}")
    }
    producer.flush()
    producer.close(10L, TimeUnit.MILLISECONDS)
  }
}

希望这对某人有帮助。