环境:CentOS6.5、hadoop1.2.1、jdk1.8.0

namenode:centos1(ip:172.16.26.129)

datanode:centos2(ip:172.16.26.130)、centos3(ip:172.16.26.131)

配置步骤:

(1)在所有机器上安装所需软件

[root@centos1 ~] # yum -y install wget, java-1.8.0-openjdk-devel, ssh

(2)在所有机器上配置NameNode和DataNode

在所有机器上修改/etc/hosts

[root@centos1 ~] # vi /etc/hosts

127.0.0.1               localhost.localdomain localhost centos1
172.16.26.129             centos1
172.16.26.130             centos2
172.16.26.131             centos3
::1             localhost6.localdomain6 localhost6 centos1

在所有机器上修改hostname

[root@centos1 ~] # hostname centos1
[root@centos1 ~] # hostname
centos1

在所有机器上修改network配置

[root@centos1 ~] # vi /etc/sysconfig/network			//修改HOSTNAME=XXX

在所有机器上关闭防火墙

[root@centos1 ~] # service iptables stop
[root@centos1 ~] # service iptables status

(3)在所有机器上建立相同的用户

在所有机器上成功建立grid用户后,设置用户密码

[root@centos1 ~] # useradd grid
[root@centos1 ~] # passwd grid

(4)在namenode上设置SSH无密码访问

在所有机器上使用grid用户登录

[root@centos1 ~] # su grid

在所有机器上/home/grid下创建ssh文件夹

[grid@centos2 ~] $ mkdir .ssh

在namenode上生成密钥对

[grid@centos1 ~] $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
[grid@centos1 ~] $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

注意点:

不进行以下步骤SSH免密码登录设置会不成功

.ssh目录要设成700 有执行权限 authorized_keys要设成600 否则会出错 还有ssh 登陆要加入用户名的 比如 ssh root@localhost

这时从centos1向其他机器发起SSH连接,只有第一次登录时需要输入密码,以后则不需要

(5)在所有机器上安装配置hadoop1.2.1

首先在namenode上配置,配置后在分发到datanode上

[grid@centos1 ~] $ wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
[grid@centos1 ~] $ tar -xf hadoop-1.2.1.tar.gz
[grid@centos1 ~] $ cd hadoop-1.2.1

接下来需要修改hadoop的conf文件夹下的配置信息:

[grid@centos1 hadoop-1.2.1] $ vi conf/hadoop-env.sh
export JAVA_HOME=/usr/java/jvm/java

修改core-site.xml,如下:

[grid@centos1 hadoop-1.2.1] $ vi conf/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://centos1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/grid/tmp</value>
</property>
</configuration>

注意:hadoop.tmp.dir是hadoop文件系统依赖的基础配置,很多路径都依赖它。它默认的位置是在/tmp/{$user}下面,在local和hdfs都会建有相同的目录,但是在/tmp路径下的存储是不安全的,因为linux一次重启,文件就可能被删除。导致namenode启动不起来。

修改hdfs-site.xml,如下

[grid@centos1 hadoop-1.2.1] $ vi conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

修改mapred-site.xml,如下(保险起见这里写centos1对应的IP地址):

[grid@centos1 hadoop-1.2.1] $ vi conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>172.16.26.129:9001</value>
</property>
</configuration>

masters里写入作为namenode节点机器的IP

[grid@centos1 hadoop-1.2.1] $ vi conf/masters
172.16.26.129

slaves里写入作为datanode节点的机器的IP

[grid@centos1 hadoop-1.2.1] $ vi conf/slaves
172.16.26.130
172.16.26.131

修改bin下的hadoop中Jvm的调用方式

[grid@centos1 hadoop-1.2.1] $ vi bin/hadoop

查找 –jvm . vi 下的命令模式: :/-jvm,将-jvm server改成 –server .

因为JDK1.6已经废除了一个参数-jvm,如果不修改的话,无法启动数据节点。

到此,hadoop的有关配置已经完成,namenode端通过如下命令把配置好的hadoop发送到各个datanode处:

[grid@centos1 hadoop-1.2.1] $ scp -r ~/hadoop-1.2.1 centos2:/home/grid
[grid@centos1 hadoop-1.2.1] $ scp -r ~/hadoop-1.2.1 centos3:/home/grid

(6)启动服务

在namenode端格式化分布式文件系统:

[grid@centos1 hadoop-1.2.1] $ bin/hadoop namenode -format

如果没有任何error字样的信息,下面接着在namenode端启动hadoop进程:

[grid@centos1 hadoop-1.2.1] $ bin/start-all.sh

如果没有其它差错的话,hadoop可以正常启动,并能够在各个机器上得到验证:

在namenode端用jps命令查看启动情况,如下:

[grid@centos1 ~] $ jps
xxxx Jps
xxxx Namenode
xxxx Secondarynamenode
xxxx JobTracker

在datanode端用jps查看启动情况,如下:

[grid@centos2 ~] $ jps
xxxx Jps
xxxx DataNode
xxxx TaskTracker

然后可以通过如下地址来查看集群运行状况:

    http://172.16.26.129:50030
    http://172.16.26.129:50070
    http://172.16.26.130:50060
    http://172.16.26.131:50060

————————————-我是分割线——————————-

跑hadoop自带的wordcount程序

1、通过hadoop的命令在HDFS上创建/tmp/workcount目录,命令如下:

[grid@centos1 hadoop-1.2.1] $ bin/hadoop fs -mkdir /tmp/wordcount

2、通过copyFromLocal命令把本地的word.txt复制到HDFS上,命令如下:

[grid@centos1 hadoop-1.2.1] $ bin/hadoop fs -copyFromLocal /home/grid/word.txt  /tmp/wordcount/word.txt

3、通过命令运行例子,使用命令如下:

[grid@centos1 hadoop-1.2.1] $ bin/hadoop jar hadoop-examples-1.2.1.jar wordcount /tmp/wordcount/word.txt  /tmp/wordcount/out

4、查看运行结果,查看例子的输出结果使用命令:

[grid@centos1 hadoop-1.2.1] $ bin/hadoop fs -ls /tmp/wordcount/out

发现有两个文件夹和一个文件,使用命令查看part-r-00000文件:

[grid@centos1 hadoop-1.2.1] $ bin/hadoop fs -cat /tmp/wordcount/out/part-r-00000

————————————-我是分割线——————————-

问题1:

namenode无法启动,启动显示host = java.net.UnknownHostException

应对:

针对每台机器需要设置正确的hostname,方法如下:

[grid@centos1 hadoop-1.2.1] $ su
[root@centos1 hadoop-1.2.1] # vi /etc/sysconfig/network			//修改HOSTNAME=XXX
[root@centos1 hadoop-1.2.1] # vi /etc/hosts						//修改映射关系从跟本机有关的IP映射到XXX
[root@centos1 hadoop-1.2.1] # hostname XXX
[root@centos1 hadoop-1.2.1] # service network restart
[root@centos1 hadoop-1.2.1] # su grid
[grid@centos1 hadoop-1.2.1] # bin/start-all.sh

问题2:

datanode无法启动,报错NoRouteToHostException: No route to host

应对:

关闭master的防火墙。

问题3:

ssh无法无密码访问,每次都需要输入密码

应对:

重启机器;设置权限为600; 暂时还没有更好的解决方法!

问题4:

查看log发现错误:Incompatible namespaceIDs

应对:

(1)停掉集群服务

(2)在出问题的datanode节点上删除data目录,data目录即是在hdfs-site.xml文件中配置的dfs.data.dir目录,本机器上那个是/var/lib/hadoop-0.20/cache/hdfs/dfs/data/ (注:我们当时在所有的datanode和namenode节点上均执行了该步骤。以防删掉后不成功,可以先把data目录保存一个副本).

(3)格式化namenode.

(4)重新启动集群。

问题5:

Cannot lock storage /tmp/hadoop-root/dfs/name. The directory is already locked.

应对:

./hadoop namenode -format 命令是格式化命名空间,一定是在未启动 hadoop 服务的时候才能执行。出现这个错误提示是因为 hadoop 的服务是子运行状态。