繁体   English   中英

ERROR 向主题发送消息时出错

[英]ERROR Error when sending message to topic

在 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

对此有什么想法吗??

而不是更改server.properties在代码本身中包含地址0.0.0.0 而不是

/usr/bin/kafka-console-producer --broker-list Hostname:9092 --topic MyFirstTopic1

使用

/usr/bin/kafka-console-producer --broker-list 0.0.0.0:9092 --topic MyFirstTopic1

这可能是因为 Kafka 的server.properties文件中的一些参数。 你可以在这里找到更多信息

  1. 停止 Kafka 服务器

    cd $KAFKA_HOME/bin ./kafka-server-stop.sh
  2. 改变

    listeners=PLAINTEXT://hostname:9092

    听众=PLAINTEXT://0.0.0.0:9092

    $KAFKA_HOME/config/server.properties

  3. 使用以下命令重新启动 Kafka 服务器

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

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

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

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

就我而言, 9092 不是我的端口 我去了 ambari,发现监听端口设置为 6667,它对我有用 :)

我遇到了类似的问题,我能够在localhost上生产和消费,但不能从网络上的不同机器上生产和消费。 基于很少的答案,我得到了一条线索,即我们需要向生产者和消费者公开advertised.listener ,但是提供0.0.0.0 也不起作用。 所以给出了针对advertised.listeners确切IP

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

我保留了listener=PLAINTEXT://:9092原样。

因此,有了这个,火花向生产者和消费者公开了广告的 ip 和端口

我今天在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 kafka-console-producer.sh才引发错误。 看起来这个工具需要修复:

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

我遇到了上述异常堆栈跟踪。 我调查并找到了根本原因。我在建立具有两个节点的 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 正在两台机器上运行。

尽管生产者是从领导者节点或追随者开始的,但我总是得到相同的结果。

在使用来自任何代理的以下命令时,我能够获得生产者的消息。

   ./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 代理在启动生产者时在内部使用 listeners=PLAINTEXT://EFGH:9092 属性。此属性必须匹配才能在启动生产者时从任何节点启动 kafka 代理。将此属性转换为 listeners= PLAINTEXT://localhost:9092 将适用于我们的第一个命令。

有这个问题:使用 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

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

侦听器不必具有主机名。

这里的另一个场景。 在我找到带有以下消息的 kafka 日志之前,我不知道发生了什么:

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

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

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

对于 Apache Kafka v2.11-1.1.0

启动zookeeper服务器:

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

启动卡夫卡服务器:

$ 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

我在 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 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值(从本地主机到公共 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)
  }
}

希望这可以帮助某人。

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

希望这可以帮助某人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM