[英]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
文件中的一些参数。 你可以在这里找到更多信息
停止 Kafka 服务器
cd $KAFKA_HOME/bin ./kafka-server-stop.sh
改变
listeners=PLAINTEXT://hostname:9092
到
听众=PLAINTEXT://0.0.0.0:9092
在$KAFKA_HOME/config/server.properties
使用以下命令重新启动 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
如果您正在运行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 生产者无法将数据推送到段日志文件。 从命令行控制台,这意味着两件事:
如果您在通过 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.