新手搭建集群的时候,往往因为集群没起来,就慌了手脚。通过jps发现,往往NameNode和ResourceManager以及 SecondaryNameNode没有进程。
以上问题的原因主要有以下两点:
- 集群id不一致
- 集群端口被占用
集群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不一致解决方法》的操作即可。