利用ubuntu搭建高可用的hadoop集群系列之五——hadoop集群搭建
1、集群部署介绍
1.1 Hadoop简介
Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统(HDFS,Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。
对于Hadoop的集群来讲,可以分成两大类角色:Master和Salve。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操作;集群中的DataNode管理存储的数据。MapReduce框 架是由一个单独运行在主节点上的JobTracker和运行在每个集群从节点的TaskTracker共同组成的。主节点负责调度构成一个作业的所有任 务,这些任务分布在不同的从节点上。主节点监控它们的执行情况,并且重新执行之前的失败任务;从节点仅负责由主节点指派的任务。当一个Job被提交 时,JobTracker接收到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。
从上面的介绍可以看出,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了文件操作和存储等支持,MapReduce在HDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。
1.2 环境说明
集群中包括4个节点:1个Master,1个Master备份节点,2个Salve,节点之间虚拟局域网连接,可以相互ping通。节点IP地址分布如下:
机器名称 | IP地址 |
nistest.master(主节点) | eth0:172.21.13.151 eth1: 192.168.21.128 eth0:0: 172.21.13.40 |
nistest.node1(slave) | eth0:172.21.13.49 |
nistest.node2(slave) | eth0:172.21.13.115 |
四个节点上均是ubuntu11.10系统,并且有一个相同的用户hadoop。Master(和backup)机器主要配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行;2个Salve机器配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。
1.3 网络配置
Hadoop集群要按照1.2小节表格所示进行配置。
下面的例子我们将以Master机器为例,即主机名为"nistest.master",IP为"192.168.116.134"进行一些主机名配置的相关操作。其他的Slave机器以此为依据进行修改。
1)查看当前机器名称
用用hostname命令进行显示机器名称,
![](https://img-my.csdn.net/uploads/201207/19/1342675173_4964.jpg)
如果跟规划的不一致,要按照下面进行修改。
![](https://img-my.csdn.net/uploads/201207/19/1342675283_5308.jpg)
2)修改当前机器名称
![](https://img-my.csdn.net/uploads/201207/19/1342675287_9931.jpg)
3)配置hosts文件(必须)
"/etc/hosts"这个文件是用来配置主机将用的DNS服务器信息,是记载LAN内接续的各主机的对应[HostName和IP]用的。当用户在进行网络连接时,首先查找该文件,寻找对应主机名(或域名)对应的IP地址。
机器为"nistest.master:192.168.116.134"对机器为"nistest.node1:192.168.116.136"用命令"ping"记性连接测试。测试结果如下:
![](https://img-my.csdn.net/uploads/201207/19/1342675291_4455.jpg)
而直接ping ip地址,如图:
![](https://img-my.csdn.net/uploads/201207/19/1342675296_4205.jpg)
从上图中的值,直接对IP地址进行测试,能够ping通,但是对主机名进行测试,发现没有ping通,提示"unknown host——未知主机"。
所以要在进行Hadoop集群配置中,需要在"/etc/hosts"文件中添加集群中所有机器的IP与主机名,这样Master与所有的Slave机器之间不仅可以通过IP进行通信,而且还可以通过主机名进行通信。所以在所有的机器上的"/etc/hosts"文件末尾中都要添加如下内容:
用以下命令进行添加:vim /etc/hosts
添加结果如下:
![](https://img-my.csdn.net/uploads/201207/19/1342675302_5365.jpg)
现在我们在进行对机器为"Slave1.Hadoop"的主机名进行ping通测试,看是否能测试成功。
![](https://img-my.csdn.net/uploads/201207/19/1342675308_6093.jpg)
2、SSH无密码验证配置
Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用 无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到 NameNode。
2.1 安装和启动SSH协议
通过下面命令进行安装。
apt-get install ssh 安装SSH协议;
apt-get install rsync (rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件);
确保所有的服务器都安装,上面命令执行完毕,各台机器之间可以通过密码验证相互登。
2.2 配置Master无密码登录所有Salve
1)SSH无密码原理
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过 SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用 私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密 码。重要过程是将客户端Master复制到Slave上。
2)Master机器上生成密码对
在Master节点上执行以下命令:ssh-keygen –t rsa –P ''
这条命令是生成其无密码密钥对,询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa和id_rsa.pub,默认存储在"/home/hadoop/.ssh"目录下。
接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
验证是否成功。
ssh localhost
2)设置SSH配置
把公钥复制所有的Slave机器上。使用下面的命令格式进行复制公钥:
scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP:~/
例如:scp ~/.ssh/id_rsa.pub hadoop@172.21.13.49:~/.ssh
上面的命令是复制文件"id_rsa.pub"到服务器IP为"172.21.13.49"的用户为"hadoop"的"/home/hadoop/"下面。
下面就针对IP为"172.21.13.49"的nistest.node1的节点进行配置。
1)把nistest.master上的公钥复制到nistest.node1上
2)追加到授权文件"authorized_keys"
到目前为止Master.Hadoop的公钥也有了,文件夹".ssh"也有了,且权限也修改了。这一步就是把nistest.master的公钥追加到nistest.node1的授权文件"authorized_keys"中去。使用下面命令进行追加并修改"authorized_keys"文件权限:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
5)在nistest.master使用SSH无密码登录nistest.node1
当前面的步骤设置完毕,就可以使用下面命令格式进行SSH无密码登录了。
![](https://img-my.csdn.net/uploads/201207/19/1342675312_8949.jpg)
3、Java环境安装
所有的机器上都要安装JDK,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装JDK以及配置环境变量,需要以"root"的身份进行。
java环境的详细安装配置见http://blog.csdn.net/wyj1986/article/details/7687479( 在ubuntu 11.10上安装配置jdk图片详解)
4、Hadoop集群安装
所有的机器上都要安装hadoop,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装和配置hadoop需要以"root"的身份进行。
4.1 安装hadoop
首先用root用户登录"nistest.node1"机器,查看我们之前用FTP上传至"/home/Hadoop"上传的"hadoop-1.0.0.tar.gz"。
接着把"hadoop-1.0.0.tar.gz"复制到"/usr/local"目录下面。
cp /home/hadoop/hadoop-1.0.0.tar.gz /usr/local
下一步进入"/usr"目录下,用下面命令把"hadoop-1.0.0.tar.gz"进行解压,并将其命名为"hadoop",把该文件夹的读权限分配给普通用户hadoop,然后删除"hadoop-1.0.0.tar.gz"安装包。
最后在"/app/hadoop"下面创建tmp文件夹,把Hadoop的安装路径添加到"/etc/profile"中,修改"/etc/profile"文件(配置java环境变量的文件),将以下语句添加到末尾,并使其有
1)在"/app/hadoop"创建"tmp"文件夹
mkdir /app/hadoop/tmp
2)配置"/etc/profile"
vim /etc/profile
3)重启"/etc/profile"
source /etc/profile
4.2 配置hadoop
1)配置hadoop-env.sh
该"hadoop-env.sh"文件位于"/usr/local/hadoop/conf"目录下。
在文件的末尾添加下面内容。
Hadoop配置文件在conf目录下,之前的版本的配置文件主要是Hadoop-default.xml和Hadoop-site.xml。由于 Hadoop发展迅速,代码量急剧增加,代码开发分为了core,hdfs和map/reduce三部分,配置文件也被分成了三个core- site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml和hdfs-site.xml是站在 HDFS角度上配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上配置文件。
2)配置core-site.xml文件
修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号。
备注:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被干掉,必须重新执行format才行,否则会出错。
用下面命令进行编辑:
3)配置hdfs-site.xml文件
修改Hadoop中HDFS的配置,配置的备份方式默认为3。
(备注:replication 是数据副本数量,默认为3,salve少于3台就会报错)
用下面命令进行编辑:
4)配置mapred-site.xml文件
修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。
用下面命令进行编辑:
5)配置masters文件
用下面命令编辑:
编辑内容如下:
6)配置slaves文件(Master主机特有)
去掉"localhost",每行只添加一个主机名,把剩余的Slave主机名都填上。
例如:添加形式如下
4.3 启动及验证
1)格式化HDFS文件系统
在"nistest.master"上使用普通用户hadoop进行操作。(备注:只需一次,下次启动不再需要格式化,只需 start-all.sh)
2)启动hadoop
在启动前关闭集群中所有机器的防火墙,不然会出现datanode开后又自动关闭。
使用下面命令启动。
3)停止hadoop
使用下面命令停止hadoop集群
4)验证hadoop 启动成功
(1)验证方法:用"jps"命令
在nistest.master上用 java自带的小工具jps查看进程。
在nistest.node1上用jps查看进程。
4.4 网页查看集群
1)访问"http//:171.21.13.151:50030"
2)访问"http//:171.21.13.151:50070"
5 运行WordCount程序
单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World",该程序的完整代码可以在Hadoop安装包的"src/examples"目录下找到。单词计数主要完成功能是:统计一系列文本文件中每个 单词出现的次数,如下图所示。
5.1 准备工作
现在以"hadoop"普通用户登录"nistest.master"服务器。
1)创建本地示例文件
首先在"/tmp"目录下创建文件夹"test"。
接着创建两个文本文件test1.txt和test2.txt,使test1.txt内容为
而test2.txt的内容为。
2)在HDFS上创建输入文件夹
3)上传本地test中文件到集群的input目录下
5.2 运行例子
1)在集群上运行WordCount程序
备注:以input作为输入目录,output目录作为输出目录。已经编译好的WordCount的Jar在"/usr/local/hadoop"下面,就是"hadoop-examples-1.0.1.jar",所以在下面执行 命令时记得把路径写全了,不然会提示找不到该Jar包。
2)MapReduce执行过程显示信息
Hadoop命令会启动一个JVM来运行这个MapReduce程序,并自动获得Hadoop的配置,同时把类的路径(及其依赖关系)加入到Hadoop 的库中。以上就是Hadoop Job的运行记录,从这里可以看到,这个Job被赋予了一个ID号:job_local_0001,而且得知输入文件有两个(Total input paths to process : 2),同时还可以了解map的输入输出记录(record数及字节数),以及reduce输入输出记录。比如说,在本例中,map的task数量是3 个,reduce的task数量是一个。map的输入record数是2个,输出record数是4个等信息。
5.3 查看结果
1)查看HDFS上output目录内容
从上图中知道生成了2个文件,我们的结果在"part-r-00000"中。
2)查看结果输出文件内容