【问题标题】:Apache Kafka: Failed to Update Metadata/java.nio.channels.ClosedChannelExceptionApache Kafka:无法更新元数据/java.nio.channels.ClosedChannelException
【发布时间】:2016-03-19 11:07:40
【问题描述】:

我刚刚开始使用 Apache Kafka/Zookeeper,并且在尝试在 AWS 上设置集群时遇到了问题。目前我有三台服务器:

一个运行 Zookeeper,两个运行 Kafka。

我可以毫无问题地启动 Kafka 服务器,并且可以在这两个服务器上创建主题。但是,当我尝试在一台机器上启动生产者并在另一台机器上启动消费者时,问题就来了:

关于 Kafka 生产者:

kafka-console-producer.sh --broker-list <kafka server 1 aws public dns>:9092,<kafka server 2 aws public dns>:9092 --topic samsa

关于 Kafka 消费者:

kafka-console-consumer.sh --zookeeper <zookeeper server ip>:2181 --topic samsa

我在生产者上输入了一条消息(“hi”),但有一段时间没有任何反应。然后我收到这条消息:

ERROR Error when sending message to topic samsa with key: null, value: 2 bytes
with error: Failed to update metadata after 60000 ms.
(org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

在消费者方面,我收到这条消息,它会定期重复:

WARN Fetching topic metadata with correlation id # for topics [Set(samsa)] from broker [BrokerEndPoint(<broker.id>,<producer's advertised.host.name>,9092)] failed (kafka.client.ClientUtils$)
java.nio.channels.ClosedChannelException
    at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
    at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:75)
    at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74)
    at kafka.producer.SyncProducer.send(SyncProducer.scala:119)
    at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59)
    at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94)
    at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)

一段时间后,生产者将开始快速抛出此错误消息,# 递增:

WARN Error while fetching metadata with correlation id # : {samsa=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)

不知道从这里去哪里。如果需要有关我的配置文件的更多详细信息,请告诉我

【问题讨论】:

    标签: java amazon-web-services apache-kafka apache-zookeeper


    【解决方案1】:

    这是一个配置问题。

    为了让它运行,必须对config 文件进行几处更改:

    在每个 Kafka 服务器上的 config/server.properties

    • host.name: &lt;Public IP&gt;
    • advertised.host.name: &lt;AWS Public DNS Address&gt;

    在每个 Kafka 服务器上的 config/producer.properties

    • metadata.broker.list: &lt;Producer Server advertised.host.name&gt;:&lt;Producer Server port&gt;,&lt;Consumer Server advertised.host.name&gt;:&lt;Consumer Server port&gt;

    在每个 Kafka 服务器的 /etc/hosts 中,将 127.0.0.1 localhost localhost.localdomain 更改为:

    <Public IP>  localhost localhost.localdomain
    

    【讨论】:

    • @kellanburker 我应该在编辑/etc/hosts 文件后重新启动任何服务吗?
    猜你喜欢
    • 2018-04-06
    • 2019-03-18
    • 2014-08-24
    • 2021-08-27
    • 2020-06-01
    • 2016-10-03
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多