CentOS6.2下Hadoop全分布式集群配置文档
集群包含三个hadoop节点:1个namenode、2个datanode。节点之间局域网连接,可以互相ping通,并且配置了节点之间互相无密码ssh访问。节点IP地址如下:
NameNode:192.168.1.220 主机名:master
DataNode 1:192.168.1.223主机名:slaver1
DataNode 2:192.168.1.224主机名:slaver2
说明:105机器能ping通,但是ssh连接上去短暂的一段时间后自动断开,必须105用ssh访问其他网络之后,才能再次连接上。检查防火墙等各种原因之后未能解决。(望大家提供指导)
三台机器系统均为CentOs6.2简体中文版。并且都新建了一个MDSS用户作为hadoop用户,其hadoop都安装在/home/MDSS/hadoop目录下。
在/etc/hosts文件中添加主机名和一下IP地址列表,以便ssh访问能识别主机名:
同时,对datanode1/192.168.15.103机器上和datanode2/192.168.15.105机器上两台机器做如上操作。(区别:datanode1 HOSTNAME=slaver1 , datanode2 HOSTENAME=slaver2)
生成密钥文件
输入如图所示命令,便可以在~/.ssh/下生产id_rsa、id_rsa.pub两个密钥文件,其中id_rsa为私钥,id_rsa.pub为公钥。
将公钥文件添加到~/.ssh/authorized_keys文件中
将公钥文件远程复制到datanode1和datanode2上
分别用MDSS登陆datanod1/slaver1和datanode2/slaver2机器上,将NameNode/master的公钥文件添加到~/.ssh/authorized_keys文件中
对anthorized_keys文件夹执行授权命令
chmod 600 .ssh/authorized_keys
此时,在namenode/master机器上执行 service sshd restart命令重启ssh服务
到此,NameNode/master的MDSS用户机器就可以无密码访问datanode1/slaver1和datanode2/slaver2的MDSS用户了
若要datanode1/slaver1和datanode2/slaver2的MDSS用户也能无密码SSH访问namenode/master的MDSS用户,只需按照以上步骤做相反的操作就可以。
在所有机器上安装jdk1.7
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
我下载的是jdk-7u5-linux-i586.rpm,可以根据自己的机器操作系统和版本选择合适的
最好还是先卸载掉openjdk,在安装sun公司的jdk
先查看 rpm -qa | grep java
显示如下信息:
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
卸载:
rpm -e --nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
还有一些其他的命令
rpm -qa | grep gcj
rpm -qa | grep jdk
如果出现找不到openjdk source的话,那么还可以这样卸载
yum -y remove java java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
yum -y remove java java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
安装下载到/opt目录下的jdk-7u5-linux-i586.rpm
编辑/etc/profile文件
在其末尾添加如下配置行:
使配置文件生效
source /etc/profile
输入javac或者java -version验证jdk安装和JAVA环境是否配置成功
出现如下图界面则配置成功
此次我安装的hadoop版本是hadoop-1.0.3
下载地址:http://mirror.bjtu.edu.cn/apache/hadoop/core/hadoop-1.0.3/
将hadoop-1.0.3.tar.gz解压至/opt/hadoop-1.0.3
将/opt/hadoop-1.0.3移置到/home/MDSS/hadoop下
在所有机器上新建/home/MDSS/hadoop_tmp文件
加入JAVA_HOME环境变量
修改fs.defaultname的value为hdfs://192.168.15.102:9000
修改hadoop.tmp.dir为/home/MDSS/hadoop_tmp
修改datanode的数量,默认为3,由于现在我只有两个datanode节点,所以配置为2,若是配置的数量大于实际的datanode节点数,则hadoop会启动失败。
加入Namenode节点IP
加入所有dataNode节点IP
编辑/etc/profile
在末尾加入
HADOOP_HOME=/home/MDSS/hadoop
PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_HOME
export PATH
使修改生效,执行:source /etc/profile
在NameNode节点启动hadoop服务
在NameNode节点上用java自带工具jps查看进程
在所有dataNode节点机器上用java自带的jps查看进程
在NameNode节点执行:hadoop dfsadmin �Creport命令查看集群状态
做好权限控制,及时检查用户是否有执行权限。
Shell代码
1.service iptables stop
Shell代码
1.service iptables stop
1.
禁用selinux:
编辑 /etc/selinux/config文件,设置“SELINUX=disabled”
4、安全模式导致的错误
org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is in safe mode
在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
Java代码
1.hadoop dfsadmin -safemode leave
关闭安全模式
Hadoop集群启动的时候一切正常,但一直处于safemode,只能读不能写,这种时候应该查看namenode的logs,当然这可能会出现不同的情况... 下面仅介绍一种错误处理方案,希望能抛砖引玉,能对大家有所启发。
以下是日志提示(此地只摘抄了重要部分)
org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /home/hadoop/tmp/mapred/system. Name node is in safe mode.
The ratio of reported blocks 0.0000 has not reached the threshold 0.9990. Safe mode will be turned off automatically.
由日志可以看出无法删除/home/hadoop/tmp/mapred/system.(其实这只是一种假象,往往我们会去纠结于这个目录,其实不然)
解决方案:
1:终极办法强制退出安全模式(safemode) hadoop dfsadmin -safemode leave 这种方式虽然快,但会有遗留问题,我在用habse的时候就遇到过,很麻烦,然后你就用“hadoop fsck /”工具慢慢恢复吧。
2:删除namenode下/home/hadoop/tmp下的所有文件,重新format,当然这种方式非常暴力,因为你的数据完全木有了(对于format后可能会遇到的问题我的另一篇文章 http://blog.csdn.net/rzhzhz/article/details/7056812有提到)
3:参考源码可发现这个错误是在检查file的时候抛出来的,基本也就是file的block丢失、错误等原因造成的。这种情况在副本数为1的情况下会很棘手,其他的时候hadoop基本能自行解决,错误数很多的情况下就会一直处于safemode下,当然你可以强制离开安全模式,先保证正常读写,然后再启用“hadoop fsck /”工具慢慢修复。
关于集群修改配置文件后的分发,本人写了一个配置文件分发工具http://blog.csdn.net/rzhzhz/article/details/7056775,希望能给大家带来便利。