先说大方向的把握吧:
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