Hadoop 完全分布式安装配置学习

来源:互联网 发布:php外卖系统源码 编辑:程序博客网 时间:2024/05/21 04:22


1.容易错误有以下几点:
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的安装目录要一致!


2.具体安装过程:
条件(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
配置环境变量:(http://blog.csdn.net/xinxin19881112/article/details/6114390)
#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所在主机名起名为masterdatanode所在的机器名字为slaveX。但这都不是必须的。
/etc/hosts文件中保存的是ip地址和主机名的一个对应关系:
127.0.0.1               localhost218.241.108.64          master218.241.108.65          slave1218.241.108.66          slave2218.241.108.67          slave3218.241.108.74          slave4218.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
slave1slave2slave3slave4slave5


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

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_keysroot@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 pathexport JAVA_HOME=/usr/java/jdk1.7.0_21export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar#hadoop pathexport HADOOP_HOME=/root/hadoop/hadoop-1.1.2export HADOOP_CONF_DIR=/root/hadoop/hadoop-1.1.2/confexport PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$PATHexport 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


转自;http://yxl22128.iteye.com/blog/1920587
原创粉丝点击