Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka Kafka QuickStart,advised.host.name提供Kafka.common.LeaderNotAvailableException_Apache Kafka - Fatal编程技术网

Apache kafka Kafka QuickStart,advised.host.name提供Kafka.common.LeaderNotAvailableException

Apache kafka Kafka QuickStart,advised.host.name提供Kafka.common.LeaderNotAvailableException,apache-kafka,Apache Kafka,我能够在一台linux机器上本地运行一个简单的单节点Kafka(Kafka_2.11-0.8.2.1),但当我尝试远程运行生产者时,我会遇到一些令人困惑的错误 我正在学习快速入门指南。我停止了卡夫卡进程并删除了/tmp中的所有zookeeper和karma文件。我在本地10.0.0.0/24网络上,使用外部IP地址进行NAT,因此我修改了server.properties以告知zookeeper如何广播我的外部地址,如下所示: 然后我运行这个: $ bin/zookeeper-server-st

我能够在一台linux机器上本地运行一个简单的单节点Kafka(Kafka_2.11-0.8.2.1),但当我尝试远程运行生产者时,我会遇到一些令人困惑的错误

我正在学习快速入门指南。我停止了卡夫卡进程并删除了/tmp中的所有zookeeper和karma文件。我在本地10.0.0.0/24网络上,使用外部IP地址进行NAT,因此我修改了
server.properties
以告知zookeeper如何广播我的外部地址,如下所示:

然后我运行这个:

$ bin/zookeeper-server-start.sh config/zookeeper.properties
--> ...
$ export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" # small test server!
$ bin/kafka-server-start.sh config/server.properties
--> ...
我在远程机器上为我的制作人打开了防火墙,创建了一个新主题并进行了验证:

$ bin/kafka-topics.sh --create --zookeeper MY.EXTERNAL.IP:2181 --replication-factor 1 --partitions 1 --topic test123
--> Created topic "test123".
$ bin/kafka-topics.sh --list --zookeeper MY.EXTERNAL.IP:2181
--> test123
但是,我正在远程运行的制作人给了我错误:

$ bin/kafka-console-producer.sh --broker-list MY.EXTERNAL.IP:9092 --topic test123
--> [2015-06-16 14:41:19,757] WARN Property topic is not valid (kafka.utils.VerifiableProperties)
My Test Message
--> [2015-06-16 14:42:43,347] WARN Error while fetching metadata [{TopicMetadata for topic test123 -> 
由于主题[test123]:类kafka.common.LeaderNotAvailableException(kafka.producer.BrokerPartitionInfo)的kafka.common.LeaderNotAvailableException}]没有主题test123的分区元数据 -->(重复了几次)

(我禁用了整个防火墙以确保这不是问题。)

karma启动中的标准输出错误重复出现:
[2015-06-16 20:42:42768]信息关闭到/MY.EXTERNAL.IP的套接字连接。(卡夫卡网络处理器)

controller.log多次告诉我:

java.nio.channels.ClosedChannelException
    at kafka.network.BlockingChannel.send(BlockingChannel.scala:100)
    at kafka.controller.RequestSendThread.liftedTree1$1(ControllerChannelManager.scala:132)
    at kafka.controller.RequestSendThread.doWork(ControllerChannelManager.scala:131)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:60)
[2015-06-16 20:44:08,128] INFO [Controller-0-to-broker-0-send-thread], Controller 0 connected to id:0,host:MY.EXTERNAL.IP,port:9092 for sending state change requests (kafka.controller.RequestSendThread)
[2015-06-16 20:44:08,428] WARN [Controller-0-to-broker-0-send-thread], Controller 0 epoch 1 fails to send request Name:LeaderAndIsrRequest;Version:0;Controller:0;ControllerEpoch:1;CorrelationId:7;ClientId:id_0-host_null-port_9092;Leaders:id:0,host:MY.EXTERNAL.IP,port:9092;PartitionState:(test123,0) -> (LeaderAndIsrInfo:(Leader:0,ISR:0,LeaderEpoch:0,ControllerEpoch:1),ReplicationFactor:1),AllReplicas:0) to broker id:0,host:MY.EXTERNAL.IP,port:9092. Reconnecting to broker. (kafka.controller.RequestSendThread)
运行此命令似乎表明0处有一个引线:

$ ./bin/kafka-topics.sh --zookeeper MY.EXTERNAL.IP:2181 --describe --topic test123
--> Topic:test123   PartitionCount:1    ReplicationFactor:1 Configs:
Topic: test123  Partition: 0    Leader: 0   Replicas: 0 Isr: 0
...
[2015-06-16 21:58:04,498] INFO 0 successfully elected as leader (kafka.server.ZookeeperLeaderElector)
[2015-06-16 21:58:04,642] INFO Registered broker 0 at path /brokers/ids/0 with address MY.EXTERNAL.IP:9092. (kafka.utils.ZkUtils$)
[2015-06-16 21:58:04,670] INFO [Kafka Server 0], started (kafka.server.KafkaServer)
[2015-06-16 21:58:04,736] INFO New leader is 0 (kafka.server.ZookeeperLeaderElector$LeaderChangeListener)
我重新运行此测试,并且我的server.log指示0处有一个leader:

$ ./bin/kafka-topics.sh --zookeeper MY.EXTERNAL.IP:2181 --describe --topic test123
--> Topic:test123   PartitionCount:1    ReplicationFactor:1 Configs:
Topic: test123  Partition: 0    Leader: 0   Replicas: 0 Isr: 0
...
[2015-06-16 21:58:04,498] INFO 0 successfully elected as leader (kafka.server.ZookeeperLeaderElector)
[2015-06-16 21:58:04,642] INFO Registered broker 0 at path /brokers/ids/0 with address MY.EXTERNAL.IP:9092. (kafka.utils.ZkUtils$)
[2015-06-16 21:58:04,670] INFO [Kafka Server 0], started (kafka.server.KafkaServer)
[2015-06-16 21:58:04,736] INFO New leader is 0 (kafka.server.ZookeeperLeaderElector$LeaderChangeListener)
当我从生产者发送消息时,我在日志中看到此错误:

[2015-06-16 22:18:24,584] ERROR [KafkaApi-0] error when handling request Name: TopicMetadataRequest; Version: 0; CorrelationId: 7; ClientId: console-producer; Topics: test123 (kafka.server.KafkaApis)
kafka.admin.AdminOperationException: replication factor: 1 larger than available brokers: 0
    at kafka.admin.AdminUtils$.assignReplicasToBrokers(AdminUtils.scala:70)

我想这意味着由于某种原因找不到经纪人?我不明白这意味着什么…

在安装Kafka的机器上,检查它是否已启动并正在运行。错误状态为0个代理可用,这意味着Kafka未启动并运行

在linux机器上,您可以使用netstat命令检查服务是否正在运行


netstat-一个| grep port_kafka_正在侦听(默认值为9092)

总之,解决方案是通过NAT添加路由,以便机器可以访问自己的外部IP地址


Zookeeper使用它在adverted.host.name中找到的地址告诉客户端在哪里找到代理,以及与代理本身通信。报告的错误并不能很清楚地说明这一点,而且这很令人困惑,因为客户端在打开TCP连接时没有问题。

将adverted.host.name设置为主机名,而不是IP地址。默认情况下,使用getCanonicalHostName()返回一个FQDN,但这只是尽最大努力,只能返回到IP。看

诀窍是让主机名始终解析为正确的IP。对于小型环境,我通常使用/etc/hosts中的所有内部IP设置所有主机。通过这种方式,所有机器都知道如何通过名称在内部网络上相互通信。事实上,现在也可以按名称而不是IP配置Kafka客户端。如果管理所有/etc/hosts文件是一个负担,那么就设置一个内部DNS服务器来集中它,但是内部DNS应该返回内部IP。这两个选项中的任何一个都应该比将IP地址分散在各种机器上的各种配置文件中要省力


一旦所有东西都按名称进行通信,剩下的就是用外部IP配置外部DNS,一切都正常工作。这包括使用服务器名而不是IP配置Kafka客户端。

从上面得到提示:对于我的单个节点(仍在学习中),我将带有文本“adverted.host.name”的server.properties文件修改为
value=127.0.01
。最后看起来是这样的

播发的.host.name=127.0.0.1


在启动producer时,它仍然显示警告,但现在它至少可以正常工作了,因为我可以在消费终端上看到消息完全符合

对于Kafka的最新版本(截至本文撰写时为0.10.0),您根本不想使用
广告的.host.name
。事实上,甚至[documentation]也指出,
advised.host.name
已经被弃用。此外,卡夫卡不仅会将其作为制作人/消费者的“广告”主机名,还会将其作为其他经纪人的主机名(在多经纪人环境中)……如果您使用不同的主机名(可能是内部主机名),这是一种痛苦代理的DNS…而且你真的不想涉足向代理的个人
/etc/hosts
添加条目的业务(ew!)

因此,基本上,您希望代理使用内部名称,但仅对生产者和消费者使用外部FQDN。为此,您将更新播发的.listeners。

conf/server.properties: 主机名
不推荐:仅在未设置
侦听器时使用。使用
侦听器
。代理的主机名。如果设置了此选项,它将仅绑定到此地址。如果没有设置,它将绑定到我以前使用过的所有接口。我们在我们的主题上设置了一个复制因子3,并且有3个代理,但是我们的一个代理无法工作,因为我们意外地给了它与另一个代理相同的代理ID。我们更改了代理ID并重新启动,这解决了问题。@JonHunter这很奇怪,因为我只有一个代理和一个主题。我昨晚在EC2上用同样的方法设置了这个,看看它是否与我的主机设置有关,但我在那里也有同样的错误。好吧,我终于弄明白了——这是我自己愚蠢的防火墙/路由错误。问题是,我没有明确允许zookeeper通过外部IP地址访问代理,即使它在同一台机器上。因此,当“advised.host.name”未配置时,它工作正常,因为zookeeper正在使用localhost。这意味着我可以很好地从远程客户端连接到服务器和zookeeper,但它没有内部通信。唉,至少我从卡夫卡身上学到了很多,试图弄明白这一点