storm前提:
搭建环境:
windows11-专业版
Docker-Desktop
zookeeper-3.5.9(官方镜像)
storm-2.4.0(官方镜像)
注意,以下的解释全是基于storm和zookeeper的官方镜像,不同的镜像的情况不同。
问题描述:
大多数同学在配置storm集群时,大多都会参考网上的配置教程,或者通过ChatGPT进行辅助编写docker-compose.yml文件。以上情况通常在storm连接单个zookeeper时是没有问题的,发生Could not find leader nimbus from seed hosts [localhost]的报错通常是在storm连接多个zookeeper的集群时出现,本次在这里给大家解决这个报错的问题。
报错如下:
问题原因:
出现以上报错目前据我已知的有以下两种情况。问题的根本原因是storm中的zookeeper.server、nimbus.seeds配置没有成功写入到storm的配置文件当中。
(以docker-compose.yml文件展示两种情况)
1、没有配置environment也缺少volumes配置
2、配置了environment,不过依旧报错。
以上两种情况经过我的测试,在浏览器中输入 localhost:8080(storm-ui的界面端口)最终都会出现以上的报错。这两种情况的根本原因是没有成功写入storm的配置文件,第一种情况是根本就没有去添加storm的相关配置。
那么第二种情况为什么配置了storm的环境,但还是有问题呢?
经过查阅大量资料,我认为是storm的docker官方镜像中不支持在docker-compose.yml文件中使用environment去对storm的配置文件做修改,也就是说在environment中添加storm_zookeeper_servers、storm_nimbus_seeds的配置信息根本不起作用。至于大家想自己看看是否真的不起作用,可以在docker-desktop中点进集群中进行查看。
解决办法:
根据在docker-hub的官网查找storm官方镜像得到的信息进行分析可得知,如果想通过docker-compose配置storm且搭上zookeeper集群的话,需要通过目录挂载的方式将storm的相关配置写入到docker的storm.yaml文件中才行。
docs/storm at master · docker-library/docs (github.com)所以我们只需要在docker-compose.yml文件中配置挂载storm.yaml文件即可。
正确的docker-compose.yml的参考配置如下:
version: '3'
networks:
storm-net:
services:
zookeeper1:
image: zookeeper:3.5.9
container_name: zookeeper1
hostname: zookeeper1
ports:
- 8101:2181
- 8102:2888
- 8103:3888
- 8108:8080
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zookeeper1:2888:3888;2181 server.2=zookeeper2:2888:3888;2181 server.3=zookeeper3:2888:3888;2181
networks:
- storm-net
zookeeper2:
image: zookeeper:3.5.9
container_name: zookeeper2
hostname: zookeeper2
ports:
- 8201:2181
- 8202:2888
- 8203:3888
- 8208:8080
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zookeeper1:2888:3888;2181 server.2=zookeeper2:2888:3888;2181 server.3=zookeeper3:2888:3888;2181
networks:
- storm-net
zookeeper3:
image: zookeeper:3.5.9
container_name: zookeeper3
hostname: zookeeper3
ports:
- 8301:2181
- 8302:2888
- 8303:3888
- 8308:8080
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zookeeper1:2888:3888;2181 server.2=zookeeper2:2888:3888;2181 server.3=zookeeper3:2888:3888;2181
networks:
- storm-net
storm-nimbus:
image: storm:2.4.0
container_name: storm-nimbus
hostname: storm-nimbus
command: storm nimbus
ports:
- 6627:6627
depends_on:
- zookeeper1
- zookeeper2
- zookeeper3
environment:
- STORM_ZOOKEEPER_SERVERS=zookeeper1,zookeeper2,zookeeper3
volumes:
- ./storm-conf/storm.yaml:/conf/storm.yaml
networks:
- storm-net
storm-supervisor1:
image: storm:2.4.0
container_name: storm-supervisor1
hostname: storm-supervisor1
command: storm supervisor
depends_on:
- storm-nimbus
volumes:
- ./storm-conf/storm.yaml:/conf/storm.yaml
networks:
- storm-net
storm-supervisor2:
image: storm:2.4.0
container_name: storm-supervisor2
hostname: storm-supervisor2
command: storm supervisor
depends_on:
- storm-nimbus
volumes:
- ./storm-conf/storm.yaml:/conf/storm.yaml
networks:
- storm-net
storm-supervisor3:
image: storm:2.4.0
container_name: storm-supervisor3
hostname: storm-supervisor3
command: storm supervisor
depends_on:
- storm-nimbus
volumes:
- ./storm-conf/storm.yaml:/conf/storm.yaml
networks:
- storm-net
storm-ui:
image: storm:2.4.0
container_name: storm-ui
hostname: storm-ui
command: storm ui
ports:
- "8080:8080"
depends_on:
- storm-nimbus
volumes:
- ./storm-conf/storm.yaml:/conf/storm.yaml
networks:
- storm-net
storm.yaml文件内容如下:zookeeper1、storm-nimbus都和docker-compose中的服务名或者容器名对应
storm.zookeeper.servers: [zookeeper1,zookeeper2,zookeeper3]
nimbus.seeds: [storm-nimbus]
文件目录结构如下:
成功运行情况
在docker-compose.yml的当前目录下,右键开启终端,在终端中输入docker-compose up -d
在docker-desktop中查看容器可见以上容器全部成功启动,且没有掉,如果容器的颜色由绿色变为橙色,则表明容器没有启动成功,宕掉了。
再在浏览器中输入 localhost:8080即可查看storm-ui的界面,查看storm集群的信息
storm配置中存在的一些其他问题及解释
1、storm-ui的界面中,明明只配置了一个nimbus但是却有两个nimbus的节点显示,其中一个是有名字的,还有一个是一串数字和字母的结合(这个其实是该节点的id),情况如下截图。
其原因是因为没有给容器设置hostname,配置之后就没问题了。
在这里再解释一下docker-compose中的服务名、容器名、hostname。
如果没有设置容器名,则docker默认将容器名设置为服务名,并且在docker-compose.yml文件中,如果需要用到depends_on或者links等其他配置,以文件中的服务名为准,比如以下截图中的depends_on中storm-nimbus就是我设置的nimbus的服务名。不过,为了避免不必要的错误和问题,建议最好服务名和容器名以及hostname都设置且相同。
2、如果以下这两种情况不要慌,是正常情况
这个情况是,日志信息显示,Apache Storm的nimbus获得了领导权,然后每隔10秒就记录一次信息,显示没有被列入黑名单的监管者(Supervisors)。这是正常的日志输出,表明你的系统正在正常运行。
在supervisor中出现大量的以下信息,这是supervisor在进行健康检查,保证supervisor正常
最后祝大家都能够成功解决软件运行时的报错,不仅如此,生活上的困扰也能顺利化解。
很喜欢”闻香识女人“中的一句话:If you make a mistake, get all tangled up, just tango on。如果你的舞步错了,那又有什么关系呢?接着tango下去就是了。
如果对相关问题依旧存有疑问,欢迎大家在评论区留言交流。要是内容存在错误、不足和改进,欢迎大家多批评指正,这对我们都很重要!
联系:
QQ:106672998
微信:hsh241817