先说大方向的把握吧:

1.先在一台机器上把所有的配置文件都改好,然后再用scp命令,传到其他机器上,以此构成集群。不要每个机器上面改,麻烦不说,还很容易漏改或者错改。

2.必须确保namenode可以无密码ssh到datanode,datanode也可以无密码ssh到namenode。这是集群间通信和hadoop集群正常运行的基础。

3.不要小瞧了/etc/hosts配置文件中的内容,安装不成功,毛病大多出在机器的hostname和/etc/hosts中的内容不一致,或者slaves,master配置文件中的对应主机名与前面二者不一致。slaves的ip要出现在master的/etc/hosts中,同样master的ip也要出现在slaves的/etc/hosts文件中。

4.防火墙要关闭。对应错误:java.net.NoRouteToHostException: No route to host

    解决办法关闭防火墙/etc/init.d/iptables stop

5.主机名不可以带下划线,否则报错。

6.jdk的安装目录要一致!

 

具体安装过程:(redhat环境,共6台机器,一台namenode,五台datanode)

一.安装jdk:从oracle官网下载jdk,hadoop要求jdk版本必须是1.6.0以上。所以要注意版本的问题。我在用wget下载东西的时候,总是超时错误,由于是ssh登陆的server,所以又没办法通过浏览器下载,无奈只好先下载到本地,然后通过SecureCRT上传到server上面。

SecureCRT在登陆控制台界面按下Alt+p,可以开启sftp模式。提示符为sfte>,在后面输入help,可以查看可用的命令。lls为查看本地目录,(这个目录是提前配置好的,可以在选项-会话选项-X/Y/Zmodern,在右边的栏中指定上传和下载目录,最好这两个目录都设定为全英文的,防止中文乱码带来的错误)。

在help下面的命令提示,put是上传命令,上传参数可以选择-a(代表ascii)或者-b(binary)模式,这里应该选择-b参数,否则用-a的话,在后续安装的过程中会报一大堆错误。

上传jdk:sftp>put -a jdk-7u21-linux-x64.rpm

安装jdk:rpm -ivh jdk-7u21-linux-x64.rpm

配置环境变量:()

#java path
export JAVA_HOME=/usr/java/jdk1.7.0_21
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

此外,hadoop要求集群中所有机器上面的jdk安装目录要一致!!!

 

二.安装hadoop:

1.先用同样的方式,将下载到本地的hadoop安装包以-b形式上传到server。然后解压缩到提前建好的hadoop目录下。

put -b hadoop-1.1.2.tar.gz
 
mkdir hadoop
tar -zxvf hadoop-1.1.2.tar.gz -C /root/hadoop/

 

2.规划hostname,/etc/hosts文件,以及/root/hadoop/hadoop-1.1.2/conf/目录下的masters,slaves文件,这几个文件对应的内容要一致。否则安装不成功。

hostname是对应的主机名,如果你以前给主机起的名字中包含了下划线_,那么一定要记得去掉下划线,否则在运行job的时候会出错。如果你给主机起的名字没有下划线,则没有必要非得重新给他改名字。但必须保证在masters和slaves中的主机名是有效的,有迹可循的。通常在安装的时候,为了方便说明,常常将namenode所在主机名起名为master,datanode所在的机器名字为slaveX。但这都不是必须的。

/etc/hosts文件中保存的是ip地址和主机名的一个对应关系:

127.0.0.1               localhost

218.241.108.64          master

218.241.108.65          slave1

218.241.108.66          slave2

218.241.108.67          slave3

218.241.108.74          slave4

218.241.108.75          slave5

为了能够让namenode和datanode之间可以正常通信,hadoop集群中的所有节点上,每个/etc/hosts文件都要包含有整个集群的信息。这样是为了能够正常解析主机名。

masters配置文件中存放担当master角色(也就是namenode)的机器的主机名。

slaves配置文件中存放担当slave角色(也就是datanode)的机器的主机名。

修改主机名:hostname master --将hostname改为master;

为保证/etc/hosts文件的一致,可用scp命令将一个修改好的hosts文件复制到其他机器上去。不易出错,而且高效:

scp  /etc/hosts  slave1:/etc/hosts 

masters和slaves的一致性,可以在将hadoop配置好后,进行整体scp 传输。

 

3.修改conf/core-site.xml;conf/hdfs-site.xml;conf/mapred-site.xml;conf/masters;conf/slaves配置文件:

conf/core-site.xml:
<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master:9000</value>   #这里的master是hostname
    </property>
 
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/root/hadoop/hadoop-1.1.2/hadoop-administrator</value>  
    </property>
 
</configuration>
 
conf/hdfs-site.xml:
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
 
        <property>
                <name>dfs.name.dir</name>
                <value>/root/hadoop/hadoop-1.1.2/hadoop-administrator/dfs/name</value>
        </property>
 
        <property>
                <name>dfs.data.dir</name>
                <value>/root/hadoop/hadoop-1.1.2/hadoop-administrator/dfs/data</value>
        </property>
 
</configuration>
 
conf/mapred-site.xml:
<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>master:9001</value>
        </property>
</configuration>
conf/masters:
master
 
conf/slaves:
slave1
slave2
slave3
slave4
slave5

至此,所有的配置文件更改完毕。

 

4.设置namenode和datanode之间无密码ssh:

4.1 Namenode无密码ssh登录到Datanode:

所有节点上执行以下命令: 

root@master# ssh-keygen    

然后一路回车就可以了。这将在/root/.ssh/目录下生成一个私钥id_rsa和一个公钥id_rsa.pub。

然后把namenode节点上面的id_rsa.pub 复制到所有datanode节点/root/.ssh/位置。

root@master# cp id_rsa.pub authorized_keys

root@master# chmod 644 authorized_keys

(注意:这是指把id_rsa.pub先拷贝成authorized_keys,再将authorized_keys复制到其它datanode上的)

root@master# scp authorized_keys slave1:/home/.ssh

使用SCP协议将namenode的公钥信息authorized_keys复制到所有DataNode的.ssh目录下,

这样配置过后,namenode可以无密码登录所有datanode,可以通过命令“ssh 节点ip地址”来验证。

 

4.2 Datanode无密码ssh登录到Namenode :

将各个datanode上的id_rsa.pub追加到namenode的authorized_keys:

在所有datanode上依次执行如下命令:

root@master# scp id_rsa.pub master:/root/.ssh/datanode_ip地址.id_rsa.pub

这里是将datanode上之前产生的公钥id_rsa.pub复制到namenode上的.ssh目录中,并重命名为datanode ip地址.id_rsa.pub,这是为了区分从各个datanode上传过来的公钥。

复制完毕,在namenode上执行以下命令,将每个datanode的公钥信息追加:

root@master# cat datanode ip地址.id_rsa.pub >> authorized_keys

这样,namenode和datanode之间便可以相互ssh上并不需要密码。至此,namenode能无密码验证登陆每个datanode。每个datanode也能无密码验证SSH登陆到namenode。

 

5.用scp命令,将配置好的hadoop,传递到其他各节点上:

scp -r  /root/hadoop/  slave1:/root/hadoop/

scp -r  /root/hadoop/  slave2:/root/hadoop/

... ... 

配置完成。

 

三.验证安装hadoop成功与否,并运行测试用例。

1.在运行hadoop之前,先需要格式化文件系统:hadoop namenode –format

2.启动所有进程:start-all.sh

在完成上面这两步之后,在namenode上面输入jps,会显示namenode上运行的进程(正常运行的话namenode上应该是3个进程):

30570 NameNode

30757 SecondaryNameNode

30843 JobTracker

在datanode上面输入jps会显示datanode上面运行的进程,正常的话应该为3个:

22866 DataNode

22974 TaskTracker

如果能显示这些,则表明hadoop已经正常启动。

 

3.查看集群运行状态:

hadoop dfsadmin -report

该命令的输出结果将显示集群的详细配置信息。

若能看到Live Datanodes个数及其详细信息,表明JobTracker已经顺利启动。

 

4.运行hadoop自带的wordcount程序,该程序完成统计单词出现次数。

 

先建立一个test目录。

$ cd hadoop-0.20.2
$ mkdir test
$ cd test
#在 test目录下创建两个文本文件, WordCount 程序将统计其中各个单词出现次数 
$ echo "hello world, bye , world." >file1.txt 
$ echo "hello hadoop, goodbye , hadoop" >file2.txt
$ cd ..
 
#将本地文件系统上的./test-txt目录拷到 HDFS 的根目录上,目录名改为 input
$ bin/hadoop fs -put test input
 
 
#执行例子中的WordCount
$ bin/hadoop jar hadoop-examples-1.1.2.jar wordcount input output 
 
 
#查看执行结果:
 
#将文件从 HDFS 拷到本地文件系统中再查看:  
$ bin/hadoop dfs -get output output
$ cat output/* 
 
#也可以直接查看  
$ bin/hadoop dfs -cat output/*
 
#停止hadoop进程 
$ bin/stop-all.sh 
 
#关闭SSH-Server 
sudo /etc/init.d/ssh stop

hadoop fs 后面直接回车可以查看fs相关的命令

 

5.hadoop是在bin目录下的可执行文件,每次输入的时候都要输入bin/hadoop 太麻烦,可以将hadoop的路径追加到profile文件中,这样在以后只需输入hadoop即可。追加内容方法如下:

 

#java path
export JAVA_HOME=/usr/java/jdk1.7.0_21
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#hadoop path
export HADOOP_HOME=/root/hadoop/hadoop-1.1.2
export HADOOP_CONF_DIR=/root/hadoop/hadoop-1.1.2/conf
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

 

6.错误原因的排查:

看NameNode为什么没起来,要看这个文件的内容: /home/hadoop-1.1.2/logs/hadoop-root-namenode-....log

看DataNode为什么没起来,要看这个文件的内容: /home/hadoop-1.1.2/logs/hadoop-root-datanode-....log

看Mapred为什么没起来,要看这个文件的内容:   /home/hadoop-1.1.2/logs/hadoop-root-jobtracker...log