让我奇怪的是对于一个新手就算按照官网的步骤做也会不停报错,导致最终搭建失败。这里记录了 很多我在搭建过程中遇到的问题,我想应该是很全了。如果你也是第一次搭建分布式hadoop,并且无法像官网说的一样顺利成功,那么希望我的这篇文章会对你有所帮助。
-
在各服务器新建用户ruc
useradd ruc
passwd ******
-
修改各ip服务器名称
编辑/etc/hosts(在root下编辑,或ruc用户用命令sudo vi /etc/hosts)
添加IP name,如202.112.114.33 lab1
如果输入sudo命令报错:xx is not in the sudoers file
返回root用户下给用户添加sudo权限
#whereis /etc/sudoers找到文件位置,一般在/etc/sudoers
#chmod u+w /etc/sudoers添加写权限
#vi /etc/sudoers
在root ALL=(ALL) ALL下添加
ruc ALL=(ALL) ALL保存
#chmod u-w /etc/sudoers取消写权限
当前命名列表
202.112.114.33 | slave1 |
202.112.114.38 | master |
-
设置ssh无密码登录
在作为master的服务器master上生成一对密钥
$ssh-keygen –t rsa
会生成id_rsa和id_rsa.pub
把公钥复制到其他slave服务器
$ssh-copy-id –i ~/.ssh/id_rsa.pub ruc@slave1
之后可直接登录slave1
$ssh ruc@slave1
-
安装jdk1.6
我的服务器是红帽,jdk1.4.2要先卸载才能更新,如果你的一切正常可跳过次步
不卸载自带的1.4,设置jdk1.6的安装无法生效。为了避免这种情况,首先还是卸载掉其自带的1.4版本的jdk:
#rpm -qa | grep jdk
#rpm -qa | grep gcj
libgcj-4.1.2-42.el5
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
上面先确认jdk的具体版本号,然后
#yum -y remove java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
Settingup Remove Process
ResolvingDependencies………..(开始卸载)
Complete!(卸载完成)
下面开始安装,安装包是/usr/lib/jvm/jdk/jdk-6u33-linux-x64.bin
首先,要给jdk-6u33-linux-x64.bin分配权限,具体的这里要给它可执行的权限,输入:
chmod +x jdk-6u33-linux-x64.bin,这里参数x即使执行权限。
[root@localhostjdk]# chmod +x jdk-6u33-linux-x64.bin
然后运行:./jdk-6u33-linux-x64.bin,
[root@localhostsoft]# ./jdk-6u33-linux-x64.bin
执行之后会有确认安装之类的,输入y,或者A,(可以根据具体出现的提示来输入)
然后回车。开始解压。一直到
Java(TM)SE Development Kit 6 successfully installed.
.........
PressEnter to continue.....
Done.
看看解压后的文件先
[root@localhostjdk]# ls
jdk1.6.0_33 jdk-6u33-linux-x64.bin
设置环境变量,将设置写入/etc/profile文件中,先执行下面命令:
[root@localhostjdk]# vi /etc/profile
打开profile文件后输入i进入insert模式,在文件中添加如下内容。
#The following is the JAVA_HOME of this environment
exportJAVA_HOME=/usr/lib/jvm/jdk/jdk1.6.0_33
exportCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/rt.jar
exportPATH=$PATH:$JAVA_HOME/bin
然后esc,输入:x,保存退出。然后需要设置让更改生效:
[root@localhostlocal]# source /etc/profile
查看现在的jdk版本:
[root@localhostlocal]# java -version
javaversion “1.6.0_33″
安装成功
-
在master上配置hadoop
打开conf文件夹修改配置文件,需要修改的文件依然是:hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml。
hadoop-env.sh
exportJAVA_HOME=/usr/lib/jvm/jdk/jdk1.6.0_33
conf/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/ruc/hadoop/tmp/hadoop-${user.name}</value>
<description>A base for other temporary directories.</description>
</property>
</configuration>
在集群中HDFS的NameNode是运行在master机器上的。
conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/ruc/hadoop/filesystem/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/ruc/hadoop/filesystem/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
<property>
<name>mapred.map.tasks</name>
<value>2</value>
<description>
definemapred.map tasks to be number of slave hosts
</description>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>2</value>
<description>
definemapred.reduce tasks to be number of slave hosts
</description>
</property>
<property>
<name>mapred.system.dir</name>
<value>/home/ruc/hadoop/filesystem/mapreduce/system</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/ruc/hadoop/filesystem/mapreduce/local</value>
</property>
</configuration>
这里配置的是JobTracker的地址及端口,在集群中JobTracker位于master主机上。
conf/masters
master-fs
conf/slaves
slave1
slave2
……
slave6
-
拷贝hadoop-1.0.3到各服务器
$scp –r hadoop-1.0.3 slave1:~
…
再配置一下各服务器的环境变量
export HADOOP_HOME=/home/ruc/hadoop
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/*.jar:$HADOOP_HOME/lib/*.jar:$HADOOP_HOME/*.jar:$CLASSPATH
-
在master上运行hadoop
$cd hadoop
$bin/hadoop namenode -format
$bin/start-all.sh
然后打开网页master:50070和master:50030重点看节点数是不是你配置的节点数,如果不是就要看日志里有什么错了
如果页面说hadoop处于安全模式safemode可输入命令bin/hadoop dfsadmin -safemode leave离开安全模式,但最好还是看下日志出了什么错
1:hadoop报错address already in use
netstat -tunlp
查找被占用的端口号对应的PID
kill PID实在不行就pkill java
2:hadoop datanode报错Server at node31/202.112.114.37:9000 not available yet, Zzzzz...
修改/etc/hosts 将127.0.0.1 命名为localhost,可能存在最先匹配,所以最好写在前面
》》》》》3:分布式的Hadoop环境,报错:jobtracker.info could only be replicated to 0 nodes, instead of 1。
这个可以说是hadoop经典问题了,网上搜了N种方法,大部分说需要重新format tmp文件夹,我的做法是把tmp,logs,filesystem三个文件夹删掉重新格式化,原因我也没搞懂。也有的说是设置的预留空间太大,tmp文件夹所在位置没有这么大的空间,修改配置后运行正常。这个我没试。其实这个错误的意思应该是说没有可用的datanode。也可能是防火墙问题,我试过关闭防火墙虽然可以,但是我不建议这样做,命令我就不写了,而且后来还会报这个错。还有一次前几个办法都不行,最后分开启动dfs和mapred就好了,很奇怪吧。
$bin/start-dfs.sh
$bin/start-mapred.sh