java.lang.RuntimeException: java.lang.RuntimeException: org.apache.zookeeper.KeeperException$NoNodeE

本文介绍了一种在使用Storm集成Kafka时遇到的错误及其解决办法。主要问题是由于Zookeeper无法找到对应的节点路径导致的NoNodeException异常。通过调整Zookeeper的连接字符串解决了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写了一个storm集成kfaka的程序,kafkaSpout消费的数据作为storm的数据源。运行报错如下:

java.lang.RuntimeException: java.lang.RuntimeException: org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /brokers/topics/topic1/partitions

at storm.kafka.DynamicBrokersReader.getBrokerInfo(DynamicBrokersReader.java:81) ~[storm-kafka-0.9.5.jar:0.9.5]
at storm.kafka.trident.ZkBrokerReader.<init>(ZkBrokerReader.java:42) ~[storm-kafka-0.9.5.jar:0.9.5]
at storm.kafka.KafkaUtils.makeBrokerReader(KafkaUtils.java:57) ~[storm-kafka-0.9.5.jar:0.9.5]
at storm.kafka.KafkaSpout.open(KafkaSpout.java:87) ~[storm-kafka-0.9.5.jar:0.9.5]
at backtype.storm.daemon.executor$fn__4249$fn__4264.invoke(executor.clj:522) ~[storm-core-0.9.5.jar:0.9.5]
at backtype.storm.util$async_loop$fn__458.invoke(util.clj:461) ~[storm-core-0.9.5.jar:0.9.5]
at clojure.lang.AFn.run(AFn.java:24) [clojure-1.5.1.jar:na]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_80]
Caused by: java.lang.RuntimeException: org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /brokers/topics/topic1/partitions
at storm.kafka.DynamicBrokersReader.getNumPartitions(DynamicBrokersReader.java:94) ~[storm-kafka-0.9.5.jar:0.9.5]
at storm.kafka.DynamicBrokersReader.getBrokerInfo(DynamicBrokersReader.java:65) ~[storm-kafka-0.9.5.jar:0.9.5]

... 7 common frames omitted


解决方法: 修改zkHost由master:2181  改为 master:2181/kafka 即可。

BrokerHosts zkHosts = new ZkHosts("master:2181/kafka");
 SpoutConfig kafkaConfig = new SpoutConfig(zkHosts, "newtopic", "/kafka", "id1");

  

### Hadoop StandbyException 异常解决方案 当遇到 `Operation category READ is not supported in state standby` 错误时,表明尝试在一个处于备用状态 (standby) 的 NameNode 上执行读取操作。这通常发生在高可用配置下,其中一个NameNode作为active节点而另一个作为standby节点。 为了处理此问题,可以采取以下措施: #### 1. 验证当前活动名称节点 确认哪个NameNode正处于活跃(active)模式,因为只有活跃的NameNode能够接受客户端请求并提供服务。通过命令行工具检查两个NameNode的状态[^2]: ```bash bin/hdfs haadmin -getServiceState nn1 ``` 如果返回的结果显示为 `standby` ,则说明该节点不是活跃节点;反之如果是 `active` 则表示其正在运行中可正常工作。 #### 2. 客户端配置调整 确保应用程序或客户端指向的是正确的活跃NameNode地址而不是固定的IP或者主机名。可以通过设置HDFS站点配置文件中的默认FS URI来实现这一点: ```xml <property> <name>fs.defaultFS</name> <value>ha-cluster</value> </property> <!-- HA configuration --> <property> <name>dfs.nameservices</name> <value>ha-cluster</value> </property> ... ``` 这样做的好处是可以让客户端自动发现集群内的活跃NameNode,并与其建立连接,从而避免因直接访问到Standby节点而导致的操作失败[^1]。 #### 3. 检查HA代理类 对于启用了高可用性的环境来说,还需要验证是否正确设置了用于管理failover过程的服务(如ZooKeeper)。特别是要保证所有必要的参数都已按照官方文档的要求进行了适当配置,比如指定合适的FailoverController实现方式等。 #### 4. 日志分析与监控 最后,在解决问题的过程中应当密切关注日志记录以及性能指标的变化情况。任何异常行为都可以帮助进一步诊断根本原因所在。同时也可以考虑部署专业的分布式系统监测平台来进行更深入的数据收集和可视化展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值