【发布时间】:2015-06-09 14:21:02
【问题描述】:
我在 HDP 2.2.4 集群上运行 Kafka 0.8.1.2.2(3 个 ZK 节点上的 3 个代理 - ZK 3.4.6.2.2)。几天来一切都很好,现在我的主题似乎已经变得无法被生产者和消费者访问了。我是 Kafka 的新手,正在寻找一种方法来确定出了什么问题以及如何修复它,因为一旦投入生产,“只是重新安装”就不是一种选择。
以前,我的主题已成功接收消息,然后可以使用这些消息。现在,即使是最基本的操作也会立即失败。如果我 ssh 到一个代理节点并创建一个新主题:
[root@dev-hdp-0 kafka]# bin/kafka-topics.sh --create --zookeeper 10.0.0.39:2181 --replication-factor 3 --partitions 3 --topic test4
Created topic "test4".
到目前为止一切顺利。现在,我们检查一下描述:
[root@dev-hdp-0 kafka]# bin/kafka-topics.sh --describe --zookeeper 10.0.0.39:2181 --topic test4
Topic:test4 PartitionCount:3 ReplicationFactor:3 Configs:
Topic: test4 Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 2
Topic: test4 Partition: 1 Leader: 0 Replicas: 0,2,1 Isr: 0,2,1
Topic: test4 Partition: 2 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2
好的 - 现在如果我创建一个消费者:
[2015-06-09 08:34:27,458] WARN [console-consumer-45097_dev-hdp-0.cloud.stp-1.sparfu.com-1433856803464-12b54195-leader-finder-thread], Failed to add leader for partitions [test4,0],[test4,2],[test4,1]; will retry (kafka.consumer.ConsumerFetcherManager$LeaderFinderThread)
java.net.ConnectException: Connection timed out
at sun.nio.ch.Net.connect0(Native Method)
at sun.nio.ch.Net.connect(Net.java:465)
at sun.nio.ch.Net.connect(Net.java:457)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:670)
at kafka.network.BlockingChannel.connect(BlockingChannel.scala:57)
at kafka.consumer.SimpleConsumer.connect(SimpleConsumer.scala:44)
at kafka.consumer.SimpleConsumer.getOrMakeConnection(SimpleConsumer.scala:142)
at kafka.consumer.SimpleConsumer.kafka$consumer$SimpleConsumer$$sendRequest(SimpleConsumer.scala:69)
at kafka.consumer.SimpleConsumer.getOffsetsBefore(SimpleConsumer.scala:124)
at kafka.consumer.SimpleConsumer.earliestOrLatestOffset(SimpleConsumer.scala:157)
at kafka.consumer.ConsumerFetcherThread.handleOffsetOutOfRange(ConsumerFetcherThread.scala:60)
at kafka.server.AbstractFetcherThread$$anonfun$addPartitions$2.apply(AbstractFetcherThread.scala:179)
at kafka.server.AbstractFetcherThread$$anonfun$addPartitions$2.apply(AbstractFetcherThread.scala:174)
at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:772)
at scala.collection.immutable.Map$Map1.foreach(Map.scala:109)
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:771)
at kafka.server.AbstractFetcherThread.addPartitions(AbstractFetcherThread.scala:174)
at kafka.server.AbstractFetcherManager$$anonfun$addFetcherForPartitions$2.apply(AbstractFetcherManager.scala:86)
at kafka.server.AbstractFetcherManager$$anonfun$addFetcherForPartitions$2.apply(AbstractFetcherManager.scala:76)
at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:772)
at scala.collection.immutable.Map$Map3.foreach(Map.scala:154)
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:771)
at kafka.server.AbstractFetcherManager.addFetcherForPartitions(AbstractFetcherManager.scala:76)
at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:95)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:51)
[2015-06-09 08:35:30,709] WARN [console-consumer-45097_dev-hdp-0.cloud.stp-1.sparfu.com-1433856803464-12b54195-leader-finder-thread], Failed to add leader for partitions [test4,0],[test4,2],[test4,1]; will retry (kafka.consumer.ConsumerFetcherManager$LeaderFinderThread)
我一直在寻找与 Failed to add leader for partitions 相关的东西,因为这似乎是关键,但我还没有找到任何有用的具体内容。
所以,如果我尝试对已知分区使用简单的消费者 shell:
[root@dev-hdp-0 kafka]# bin/kafka-simple-consumer-shell.sh --broker-list 10.0.0.39:6667,10.0.0.45:6667,10.0.0.48:6667 --skip-message-on-error --offset -1 --print-offsets --topic test4 --partition 0
Error: partition 0 does not exist for topic test4
尽管--describe 操作清楚地表明partition 0 确实存在。
我有一个简单的 Spark 应用程序,它向一个主题发布少量消息,但这也无法发布(在全新和旧的、以前工作的主题上)。这里的控制台摘录也暗示了leader问题:
15/06/08 15:05:35 WARN BrokerPartitionInfo: Error while fetching metadata [{TopicMetadata for topic test8 ->
No partition metadata for topic test8 due to kafka.common.LeaderNotAvailableException}] for topic [test8]: class kafka.common.LeaderNotAvailableException
15/06/08 15:05:35 ERROR DefaultEventHandler: Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: test8
15/06/08 15:05:35 WARN BrokerPartitionInfo: Error while fetching metadata [{TopicMetadata for topic test8 ->
No partition metadata for topic test8 due to kafka.common.LeaderNotAvailableException}] for topic [test8]: class kafka.common.LeaderNotAvailableException
另外,如果我们尝试控制台生产者:
[root@dev-hdp-0 kafka]# bin/kafka-console-producer.sh --broker-list 10.0.0.39:6667,10.0.0.45:6667,10.0.0.48:6667 --topic test4
foo
[2015-06-09 08:58:36,456] WARN Error while fetching metadata [{TopicMetadata for topic test4 ->
No partition metadata for topic test4 due to kafka.common.LeaderNotAvailableException}] for topic [test4]: class kafka.common.LeaderNotAvailableException (kafka.producer.BrokerPartitionInfo)
我已经扫描了 /var/log/kafka 下的日志,没有什么比控制台输出本身更具描述性了。搜索各种异常的结果与具有类似神秘问题的其他异常相比几乎没有什么收获。
话虽如此,有没有办法正确诊断为什么我的代理集在环境或配置没有更改时突然停止工作?有没有人遇到过类似的情况并找到了一套纠正措施?
其他一些细节: OpenStack 私有云上的所有节点都是 CentOS 6.6 使用 Ambari 2.0.0 安装和配置 HDP Cluster 2.2.4.2-2 Kafka 服务已经重启(现在有好几次了……)
不确定还有什么可能有帮助 - 如果有其他细节可以帮助阐明问题,请告诉我。
谢谢。
【问题讨论】:
-
zookeeper 运行正常吗?
-
是的,ZK 正在运行并已重新启动。我实际上已经停止了 ZK 和 Kafka,从所有节点中删除了 /hadoop/zookeeper 和 /kafka-logs/ 目录。这样的尝试绝不会让事情重新投入生产,但我只是想让它恢复工作而无需删除和重新安装服务。我现在看到的令人费解的行为是,如果我创建一个新主题(3 个分区,3 个复制因子),我只能在一个节点上看到分区目录。此外,我认为我应该在 ZK 目录中看不到 `/brokers/{brokerId}/topics/{topicName} 之类的东西。
-
我把它拿回来,使用 zkCli 我可以看到 /brokers/topics/{topicName}/partitions/etc... 所以就在那里,ZK 正在运行,得到了 Ambari 以外的其他东西的确认。跨度>
标签: hadoop apache-kafka hortonworks-data-platform