新手搭建集群的时候,往往因为集群没起来,就慌了手脚。通过jps发现,往往NameNode和ResourceManager以及 SecondaryNameNode没有进程。
以上问题的原因主要有以下两点:
- 集群id不一致
- 集群端口被占用
原因:多次进行namenode格式化造成集群id不一致
解决方法:
方法1:删除hadoop集群每个服务器目录下的data和log文件,然后重新启动集群。
方法2:查看data目录下的name中 data/tmp/dfs/data/current/VERSION下的集群id。
#Sat Dec 11 15:36:37 CST 2021 storageID=DS-407cb097-3a25-4589-baa7-d6455a0c6b47 clusterID=CID-d13c02ff-43b5-47fd-a4be-019fcca18398 cTime=0 datanodeUuid=824abac6-b613-4eaf-9f61-bbedf662be1c storageType=DATA_NODE layoutVersion=-56
复制其中的clusterID。然后查看其它的datanode节点的集群中对应的VERSION中的信息,让后将namenode中的clusterID覆盖datanode中的clusterID就好了。
集群端口被占用在启动namenode或ResourceManager失败后,我们同样查看hadoop下log中的日志,日志是很重要的,看了日志比胡乱去猜要好很多。
这里以查看ResourceManager的启动日志为例:
Caused by: java.net.BindException: Problem binding to [hadoop2:8031] java.net.BindException: Address already in use; For more details see: http://wiki.apache.org/hadoop/BindException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:792) at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:721)
我们可以看到:Problem binding to [hadoop2:8031] java.net.BindException: Address already in use,意思是这个端口正在使用,正是因为这个原因,才导致我们的ResourceManager启动失败。
问题的原因:拿我自己的经历来说,因为我多次格式化namenode,导致在启动集群的时候,使用jps发现namenode和ResourceManager以及 SecondaryNameNode进程都没起来,但是在后台中,我以上进行都已启动并正在运行,只是因为clusterID的不一致,才导致三个进程没有展示出来。
解决办法:重启集群,再重复《集群id不一致解决方法》的操作即可。



