师兄给十二台服务器搭建了hadoop平台,10.*.*.33 - 10.*.*.44, 其中33为namenode, 作为master,其他11台都是slaves。
所有的配置,包括hadoop-env.sh, hdfs-site.xml, mapred-site.xml, masters, slaves, core-site.xml都没有问题,可是进入bin,./start-all.sh之后,mapreduce部分是运行正常的,即通过浏览器http://10.*.*.33:50030/jobtracker.jsp是成功的,可是50070却失败(dfs部分没有成功,http://10.*.*.33:50070/dfshealth.jsp访问失败)。
找到logs目录下的hadoop-***-namenode-***-33.log,里面显示出错,我一共遇到了两个错误,我一直改来改去,十二台机器一起改,耗了我一个通宵,最后还是除掉了问题,算是没有白花力气,总结问题如下:
1. 在hdfs-site.xml里
<name>dfs.name.dir</name>
<value>/home/cadal/data/hadoop/cluster/name</value>
为namenode配置的路径,一定要保证/home/cadal/data/hadoop文件夹下的所有文件的用户和组别都不能是root!比如我的用户名是cadal,组别是cadal,就要用命令改变hadoop文件夹内所有子文件夹都是cadal/cadal:
sudo chown -R cadal hadoop sudo chgrp -R cadal hadoop
2. 以上这步是为了在/bin下面做./hadoop namenode -format,可以尝试一下,如果在这里命令前面加sudo是不允许的,这应该就是为什么/home/cadal/data/hadoop不能是root组别和root用户的原因。
继续说,在/bin下,每次./start-all.sh或者.start-dfs.sh和stop操作的时候,都要做./hadoop namenode -format,而往往data format会失败,记住,如果没有执行成功的时候,一定要去/home/cadal/data/hadoop/cluster/name下,执行
sudo rm -rf name
把已有name删除,再回到/bin下执行
./hadoop namenode -format
换句话说,也许你没有看到./hadoop namenode -format执行失败的提示(没有出现successfully这个词),http://10.*.*.33:50070/dfshealth.jsp访问依然失败,你就会去/logs的
hadoop-***-namenode-***-33.log查到
java.io.IOException: NameNode is not formatted.
或者别的类似的错误,比如我在更改root/root之前,一直遇到的
Directory /home/cadal/data/hadoop/cluster/name is in an inconsistant state: storage directory does not exist or is not accessible.
归根到底原因都是./hadoop namenode -format执行失败,为什么失败?
a. /home/cadal/data/hadoop文件夹下的文件的用户和组别是root
b. 执行前没有去删除/home/cadal/data/hadoop/cluster/name